Сразу скажу, что являюсь ученым и никогда ранее в linux не работал.Но вот по работе понадобилось, поэтому не бейте больно за вопрос.
Существует проблема:
Есть каталог и в нем лежат папки с именами от 00000 до 1000000 с шагом 10000, т.е. папки с именами 00000,10000,20000,...,1000000.В этих папках лежат файлы file1.название папки,file2.название папки,file3.название папки. Эти файлы нужно переместить соответсвенно в папки A,B,C, которые лежат в тот же каталог, что и папки с именами 00000 до 1000000.
Возможно ли это вообще?И если возможно как это сделать?
Если так не возможно, то можно ли переместить файлы не в папки A,B,C а в тот каталог в котором лежат папки 00000 до 1000000?
Передвижение файлов
Всё это возможно.
Я бы подсказал, если бы было понятнее что и куда перемещать. Например каталогов с числами в названии у тебя 100 штук, ты из них файлы хочешь переместить в каталоги с латинскими буквами, но таких букв всего 26 в алфавите. Что делать с остальными?
Правильно ли я понял структуру?
Локальный корень (условно, каталог в котором все остальные) обзовем просто "Корень"
- Корень
- 00000
- file1.00000
- file2.00000
- 10000
- file1.10000
- file2.10000
- A
- BЕсли так, то переместить Корень/00000/file1.00000 в Корень/A можно так
[console]# если находим в каталоге "Корень"
mv 00000/file1.00000 A/file1.00000
# если находим в каталоге 00000
mv file1.00000 ../A/file1.00000[/console]
Автоматизировать можно как-то так, если запускать из "корня"
#!/bin/bash
for item in 00000_A 10000_B # и т.д.
do
cur=`echo "${item}" | cut -d "_" -f1`
dest=`echo "${item}" | cut -d "_" -f2`
mv "${cur}/*.${cur}" "${dest}"
done
У 00000_A получится cur 00000 и dest A соответственно, после выполнится mv 00000/*.00000 (т.е. по маске переместит все подходящие файлы- file1.00000, file2.00000 и т.д.) в A.
Ну и т.д.
Мы создаём себе проблемы (хотя бы с именами и "шагом 10000", а потом - "героически их преодалеваем..." :(
xxblx
Он хочет "однострок", чтобы всё и сразу... Ещё и сортировку... Не выйдет?
Не выйдет?
Выйдет всё при наличии конкретной информации о входных данных. По имеющейся информации я дал достаточно точное направление для пробы.
[quote="mvt"]Не выйдет?
Выйдет всё при наличии конкретной информации о входных данных. По имеющейся информации я дал достаточно точное направление для пробы.[/quote]
У меня есть тоже версия :) Но, подождём ТС? :)
Он хочет "однострок", чтобы всё и сразу... Ещё и сортировку... Не выйдет?
в последнее время таких стало появляться все больше и больше, странно всё это. Или это какая-то генерация "смутного времени" которая таки подросла и осилила кнопки на клавиатуре?
А по теме, то что ТС хочет рассортировать кучу файлов в куче каталогов по какому-то алгоритму это понятно, но мысли он свои выразил как-то очень не очень..
gramozeka
Тут, мне кажется, человек э... не фонтазирует. Он написал "являюсь ученым и никогда ранее в linux не работал". А учёные - категория смутная. Может, он - филолог? Или доктор. Какой там, нафиг, Linux? Если придёт - вежливый допрос :) Хорошо? :)
mvt, та не вопрос, но мысли, для учёного, он выражает весьма сумбурно. В любом случае ждем, там на баше в десяток строк уложить можно, главное понять задачу.
вопрос к ТС - готов ли он поделиться непосильно нажитым презренным металлом за готовое решение, или предпочитает помучиться и самостоятельно решить данную проблему изучив пару-тройку руководств коих в интернете как грязи?
mvt, та не вопрос, но мысли, для учёного, он выражает весьма сумбурно. В любом случае ждем, там на баше в десяток строк уложить можно, главное понять задачу.
Дык, задача понятна. Как обычно, всё сваляно вместе. Десяток (или сто?) папок в одном каталоге. Тетерь хочется как-то их упорядочнить. (дали, наверное новый раздел). Создаём каталоги A, B, C и сортируем "то, что было". Непонятоно, правда, по какому признаку сортируем (куда что класть? ) И имена - будем менять?
PS Вопрос не ко мне, ждём ТС :(
Непонятоно, правда, по какому признаку сортируем (куда что класть? ) И имена - будем менять?
PS Вопрос не ко мне, ждём ТС ac
насчет сумбурности я именно об этом. А где что лежит значения не имеет. Поиск и сортировку можно организовать и глобально, хоть с самого корня ФС.
[quote="mvt"]Непонятоно, правда, по какому признаку сортируем (куда что класть? ) И имена - будем менять?
PS Вопрос не ко мне, ждём ТС ac
насчет сумбурности я именно об этом. А где что лежит значения не имеет. Поиск и сортировку можно организовать и глобально, хоть с самого корня ФС.[/quote]
Ну да. Там нет задач "с корня". Всё в одном каталоге. Но, нафига каталоги A, B, С ? Надо всё рассовывать "по местам"? А Вы знаете критерии? А вот хотелось бы, чтобы ТС более подробно обозначил задачу. Нет?
gramozeka
что всегда убивает? Неправильно поставленная задача. Если дали новый пустой раздел - нельзя создать на нём каталог и сделать на него ссылку в действующий? И, "по умолчанию" всё пойдёт на новый"? Это - решение вопроса?
А реально - человек всегда опирается на свои знания. И нужен опыт (и буквари) для того чтобы это всё несколько расширить. А напишите на эту тему просто статью. Мы здесь - нафига собрались?
PS А я - Вас тоже почитаю, мне - тоже всё это - интересно...
А напишите на эту тему просто статью. Мы здесь - нафига собрались?
А смысл ? инет просто забит подобным писательством, да и "чукча не писатель - чукча читатель" :D , писать это куча времени, которого и так вечно не хватает, а на работе не до писательства - работать надо, заказов набрали уже на июнь. Для меня тема linux это чистой воды моя личная придурь, так чтоб не сторчаться от скуки. На работе я что-то среднее между разнорабочим и дворником с репутацией "если какие-то проблемы с компами спроси у него он должен знать, если сломалось что-то в цехе(из оборудования) иди к нему - он починит и т.д." за это и держат пока.
А проблема ТС решаема многими средствами, на том же баше, но нужна четко поставленная задача, ясные условия и ессно интерес. При желании, не вникая в тонкости, можно нагуглить решение в течении дня.
вот наколеночный вариант(как пример, должен работать, не проверял)
#!/bin/sh
CWD=$(pwd)
find -type d | while read DIRNAME; do
cd $DIRNAME
find -type f | while read FILENAME; do
# здесь что-то с файлами делаем например:
mv /абсолютный_путь_к_целевой_директории $FILENAME
echo "$FILENAME перемещён"
done
cd $CWD
echo "$DIRNAME очищена"
done
Ох тут понаписали.Пока меня пол дня не было.Я не шум никакой.Я правда по науке вынужден этим всем заниматься.
Может сумбурно написал, но как получилось.Вообщем постараюсь переформулировать:
есть каталог в котором лежат папки с именами 00000,10000,20000 и т.д.(через 10000):
.../00000,.../10000.
В каждой из эти папок лежат файлы file1.название папки,file2.название папки,file3.название папки.Т.е. например:
.../00000/file1.00000
.../00000/file2.00000
.../00000/file3.00000
Файлы file1 нужно забрать из этих папок и переместить в папку A лежащую в этом же каталоге что и изначальные папки.Т.е. например:
.../A
В папки B,C нужно переместить соответсвенно file2,file3.Т.е. чтобы стало например
.../A/file1.00000
.../B/file2.00000
.../C/file3.00000
И да я честно пытался про команду mv читать, но не понял как это организовать.Эксперименты глупые не могу проводить.Можно потерять важные файлы.Поэтому специально зарегистрировался и решил спросить знающих людей.
Все можно, но ТЗ никуда не годное)) Нужен вывод например команды tree - "вместо тысячи слов" :)
И да я честно пытался про команду mv читать, но не понял как это организовать.Эксперименты глупые не могу проводить.Можно потерять важные файлы.Поэтому специально зарегистрировался и решил спросить знающих людей.
смотри мой предыдущий пост. Скопируй код, создай текстовый файл в редакторе, к примеру kwrite, вставь туда код, сохрани, ПКМ по этому файлу>Свойства>Права>Сделать исполняемым. Помести его в каталог в котором лежат папки с именами 00000,10000,20000... Каталоги A,B,C должны быть выше чем начальный, либо нужно добавить проверку в первый цикл(чтоб скрипт не лез в них) и запусти из командной строки.
Вот вариант с проверкой:
#!/bin/bash
CWD=$(pwd)
find -type d | while read DIRNAME; do
if [ ${DIRNAME} == "A" ] || [ ${DIRNAME} == "B" ] || [ ${DIRNAME} == "C" ] || [ ${DIRNAME} == "." ]
then continue
fi
cd $DIRNAME
find -type f | while read FILENAME; do
if [[ $FILENAME =~ "file1" ]]
then mv -f $FILENAME $CWD/A 2> /dev/null
fi
if [[ $FILENAME =~ "file2" ]]
then mv -f $FILENAME $CWD/B 2> /dev/null
fi
if [[ $FILENAME =~ "file3" ]]
then mv -f $FILENAME $CWD/C 2> /dev/null
fi
done
cd $CWD
done
Это должно работать, но перед экспериментами сделай бекап, это априори.
не работает *DONT_KNOW*
P.S. алкоголь суть зло :[
вот так работает:
#!/bin/bash
CWD=$(pwd)
find -type d | while read DIRNAME; do
if [ ${DIRNAME} == "./A" ] || [ ${DIRNAME} == "./B" ] || [ ${DIRNAME} == "./C" ] || [ ${DIRNAME} == "." ]
then continue
fi
cd $DIRNAME
find -type f | while read FILENAME; do
if [[ $FILENAME =~ "file1" ]]
then mv -f $FILENAME $CWD/A 2> /dev/null
fi
if [[ $FILENAME =~ "file2" ]]
then mv -f $FILENAME $CWD/B 2> /dev/null
fi
if [[ $FILENAME =~ "file3" ]]
then mv -f $FILENAME $CWD/C 2> /dev/null
fi
done
cd $CWD
done
P.S. пробел забыл поставить.
ТС решил проблему?
#!/bin/bash
LETTERS="ABCDEFGHIJKLMNOPQRSTUVWXYZ"
# Проходим по всем каталогам в текущем каталоге
for item in ${PWD}/*
do
# Пропускаем каталоги с именами A, B и т.д.
test_res=`expr match "${LETTERS}" ".*$(basename ${item})"`
if (( "${test_res}" > 0 )); then
continue
fi
# Проверяем пустой ли каталог
lsitem=`ls ${item}`
# Если каталог не пустой
if [ -d "${item}" -a -n "${lsitem}" ]; then
# Обходим по очереди каждый файл
for f in ${item}/*
do
# Дергаем цифру из названия и выбираем каталог с буквой
N=`echo "$(basename ${f})" | grep -oE "[0-9]*" -c1`
L="${LETTERS:N-1:1}"
# Перемещаем
mv "${f}" "${PWD}/${L}"
echo "Moved: ${f} -> ${PWD}/${L}/$(basename ${f})"
done
fi
done