LinuxForum.Fans
Тема

Передвижение файлов

Автор: fizik_ku 20 сообщений 2323 просмотров
14.02.2015 10:03 #414224

Сразу скажу, что являюсь ученым и никогда ранее в linux не работал.Но вот по работе понадобилось, поэтому не бейте больно за вопрос.
Существует проблема:
Есть каталог и в нем лежат папки с именами от 00000 до 1000000 с шагом 10000, т.е. папки с именами 00000,10000,20000,...,1000000.В этих папках лежат файлы file1.название папки,file2.название папки,file3.название папки. Эти файлы нужно переместить соответсвенно в папки A,B,C, которые лежат в тот же каталог, что и папки с именами 00000 до 1000000.
Возможно ли это вообще?И если возможно как это сделать?
Если так не возможно, то можно ли переместить файлы не в папки A,B,C а в тот каталог в котором лежат папки 00000 до 1000000?

14.02.2015 10:14 #414225

Всё это возможно.
Я бы подсказал, если бы было понятнее что и куда перемещать. Например каталогов с числами в названии у тебя 100 штук, ты из них файлы хочешь переместить в каталоги с латинскими буквами, но таких букв всего 26 в алфавите. Что делать с остальными?

14.02.2015 18:05 · отредактировано #414248

Правильно ли я понял структуру?

Локальный корень (условно, каталог в котором все остальные) обзовем просто "Корень"

text
- Корень
    - 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]

Автоматизировать можно как-то так, если запускать из "корня"

text
#!/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.
Ну и т.д.

14.02.2015 18:20 #414249

Мы создаём себе проблемы (хотя бы с именами и "шагом 10000", а потом - "героически их преодалеваем..." :(
xxblx
Он хочет "однострок", чтобы всё и сразу... Ещё и сортировку... Не выйдет?

14.02.2015 18:33 #414253
"mvt" написал:
Не выйдет?

Выйдет всё при наличии конкретной информации о входных данных. По имеющейся информации я дал достаточно точное направление для пробы.

14.02.2015 18:41 #414256
xxblx написал:
[quote="mvt"]Не выйдет?

Выйдет всё при наличии конкретной информации о входных данных. По имеющейся информации я дал достаточно точное направление для пробы.[/quote]
У меня есть тоже версия :) Но, подождём ТС? :)

14.02.2015 20:17 #414267
"mvt" написал:
Он хочет "однострок", чтобы всё и сразу... Ещё и сортировку... Не выйдет?

в последнее время таких стало появляться все больше и больше, странно всё это. Или это какая-то генерация "смутного времени" которая таки подросла и осилила кнопки на клавиатуре?

А по теме, то что ТС хочет рассортировать кучу файлов в куче каталогов по какому-то алгоритму это понятно, но мысли он свои выразил как-то очень не очень..

14.02.2015 20:25 #414269

gramozeka
Тут, мне кажется, человек э... не фонтазирует. Он написал "являюсь ученым и никогда ранее в linux не работал". А учёные - категория смутная. Может, он - филолог? Или доктор. Какой там, нафиг, Linux? Если придёт - вежливый допрос :) Хорошо? :)

14.02.2015 20:34 · отредактировано #414270

mvt, та не вопрос, но мысли, для учёного, он выражает весьма сумбурно. В любом случае ждем, там на баше в десяток строк уложить можно, главное понять задачу.
вопрос к ТС - готов ли он поделиться непосильно нажитым презренным металлом за готовое решение, или предпочитает помучиться и самостоятельно решить данную проблему изучив пару-тройку руководств коих в интернете как грязи?

14.02.2015 20:48 #414273
gramozeka написал:
mvt, та не вопрос, но мысли, для учёного, он выражает весьма сумбурно. В любом случае ждем, там на баше в десяток строк уложить можно, главное понять задачу.

Дык, задача понятна. Как обычно, всё сваляно вместе. Десяток (или сто?) папок в одном каталоге. Тетерь хочется как-то их упорядочнить. (дали, наверное новый раздел). Создаём каталоги A, B, C и сортируем "то, что было". Непонятоно, правда, по какому признаку сортируем (куда что класть? ) И имена - будем менять?
PS Вопрос не ко мне, ждём ТС :(

14.02.2015 20:51 #414275
"mvt" написал:
Непонятоно, правда, по какому признаку сортируем (куда что класть? ) И имена - будем менять?
PS Вопрос не ко мне, ждём ТС ac

насчет сумбурности я именно об этом. А где что лежит значения не имеет. Поиск и сортировку можно организовать и глобально, хоть с самого корня ФС.

14.02.2015 20:57 · отредактировано #414277
gramozeka написал:
[quote="mvt"]Непонятоно, правда, по какому признаку сортируем (куда что класть? ) И имена - будем менять?
PS Вопрос не ко мне, ждём ТС ac

насчет сумбурности я именно об этом. А где что лежит значения не имеет. Поиск и сортировку можно организовать и глобально, хоть с самого корня ФС.[/quote]
Ну да. Там нет задач "с корня". Всё в одном каталоге. Но, нафига каталоги A, B, С ? Надо всё рассовывать "по местам"? А Вы знаете критерии? А вот хотелось бы, чтобы ТС более подробно обозначил задачу. Нет?

14.02.2015 21:18 #414284

gramozeka
что всегда убивает? Неправильно поставленная задача. Если дали новый пустой раздел - нельзя создать на нём каталог и сделать на него ссылку в действующий? И, "по умолчанию" всё пойдёт на новый"? Это - решение вопроса?
А реально - человек всегда опирается на свои знания. И нужен опыт (и буквари) для того чтобы это всё несколько расширить. А напишите на эту тему просто статью. Мы здесь - нафига собрались?
PS А я - Вас тоже почитаю, мне - тоже всё это - интересно...

14.02.2015 23:33 #414304
"mvt" написал:
А напишите на эту тему просто статью. Мы здесь - нафига собрались?

А смысл ? инет просто забит подобным писательством, да и "чукча не писатель - чукча читатель" :D , писать это куча времени, которого и так вечно не хватает, а на работе не до писательства - работать надо, заказов набрали уже на июнь. Для меня тема linux это чистой воды моя личная придурь, так чтоб не сторчаться от скуки. На работе я что-то среднее между разнорабочим и дворником с репутацией "если какие-то проблемы с компами спроси у него он должен знать, если сломалось что-то в цехе(из оборудования) иди к нему - он починит и т.д." за это и держат пока.

А проблема ТС решаема многими средствами, на том же баше, но нужна четко поставленная задача, ясные условия и ессно интерес. При желании, не вникая в тонкости, можно нагуглить решение в течении дня.
вот наколеночный вариант(как пример, должен работать, не проверял)

text

#!/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
14.02.2015 23:37 #414305

Ох тут понаписали.Пока меня пол дня не было.Я не шум никакой.Я правда по науке вынужден этим всем заниматься.
Может сумбурно написал, но как получилось.Вообщем постараюсь переформулировать:
есть каталог в котором лежат папки с именами 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 читать, но не понял как это организовать.Эксперименты глупые не могу проводить.Можно потерять важные файлы.Поэтому специально зарегистрировался и решил спросить знающих людей.

14.02.2015 23:48 #414306

Все можно, но ТЗ никуда не годное)) Нужен вывод например команды tree - "вместо тысячи слов" :)

15.02.2015 00:16 · отредактировано #414309
"fizik_ku" написал:
И да я честно пытался про команду mv читать, но не понял как это организовать.Эксперименты глупые не могу проводить.Можно потерять важные файлы.Поэтому специально зарегистрировался и решил спросить знающих людей.

смотри мой предыдущий пост. Скопируй код, создай текстовый файл в редакторе, к примеру kwrite, вставь туда код, сохрани, ПКМ по этому файлу>Свойства>Права>Сделать исполняемым. Помести его в каталог в котором лежат папки с именами 00000,10000,20000... Каталоги A,B,C должны быть выше чем начальный, либо нужно добавить проверку в первый цикл(чтоб скрипт не лез в них) и запусти из командной строки.
Вот вариант с проверкой:

text

#!/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

Это должно работать, но перед экспериментами сделай бекап, это априори.

15.02.2015 00:32 · отредактировано #414310

не работает *DONT_KNOW*

P.S. алкоголь суть зло :[
вот так работает:

text

#!/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. пробел забыл поставить.

16.02.2015 15:53 #414503

ТС решил проблему?

16.02.2015 17:57 · отредактировано #414517
text
#!/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

Войдите или зарегистрируйтесь, чтобы ответить.