Переместить все файлы из подкаталогов в текущий каталог?

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

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

mv * . 

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

 mv: wil and ./wil are identical 

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

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

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

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

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

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

Очистите все пустые подкаталоги с помощью

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

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

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

Дополнительная информация: попробуйте только поиск-старость, он должен предоставить вам список со всеми файлами, которые вы хотите переместить (оставьте вне -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 . Выполняется для каждого найденного файла.

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

Баш 4:

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

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

 mv *.* subdir/ mv .* subdir/ 

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

mv **/*.* .

Давайте будем гением компьютера.