9

Как я могу переместить файлы, содержащиеся во всех подкаталогах, в текущий каталог, а затем удалить пустые подкаталоги?

Я нашел этот вопрос, но адаптирую ответ на:

mv * .

не работал; Я получил много предупреждений в виде:

mv: wil and ./wil are identical

Файлы, содержащиеся в подкаталогах, имеют уникальные имена.

5 ответов5

16

Вы также можете использовать опцию -mindepth :

find . -type f -mindepth 2 -exec mv -i -- {} . \;

(Вместе с -maxdepth вы также можете ограничить уровни иерархии, с которых будут собираться файлы.)

Я использовал mv -i («интерактивный»), чтобы заставить mv ask перед перезаписью файлов. При большом количестве подкаталогов могут возникнуть конфликты имен, о которых вы хотели бы получить предупреждение.

Опция -- останавливает обработку опции, поэтому mv не смущает имена файлов, начинающиеся с дефиса.

Очистите целую кучу пустых подкаталогов с

find . -depth -mindepth 1 -type d -empty -exec rmdir {} \;
4

Попробуй это:

find ./*/* -type f -print0 | xargs -0 -J % mv % .

Дополнительная информация: попробуйте найти find-stamement в одиночку, он должен дать вам список всех файлов, которые вы хотите переместить (не -print0). Пример:

probe:test trurl$ find ./*/* -type f
./test_s/test_s_s/testf4
./test_s/test_s_s/testf5
./test_s/testf1
./test_s/testf2
./test_s/testf3
./test_s2/testf6
./test_s2/testf7

с -print0 и xargs вы теперь создаете список операторов, которые должны быть выполнены. Флаг -J % означает, вставьте сюда элемент списка, так что mv $FILE . выполняется для каждого найденного файла.

Выше работает для BSD XARGS. Если вы используете GNU-версию (Linux), берите -I % вместо -J %

0

Баш 4:

shopt -s globstar
for file in **; do [[ -f "$file" ]] && mv "$file" .; done
-2

1 быстрый трюк, работает, только если ваши файлы имеют расширения (с точкой):

mv *.* subdir/
mv .* subdir/
-2

Просто запустите эту команду :-)

mv **/*.* .

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .