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

13

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

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

mv * .

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

mv: wil and ./wil are identical

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

Ричард
источник

Ответы:

22

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

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

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

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

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

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

find . -depth -mindepth 1 -type d -empty -exec rmdir {} \;
Флориан Дженн
источник
Есть ли способ пропустить вопрос о перезаписи файлов, не перезаписывая их?
Филнор
2
Опции для mv:: -n, --no-clobberне перезаписывать существующий файл. Возможно, вас это тоже заинтересует -b, --backup.
Флориан Дженн
5

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

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 .выполняется для каждого найденного файла.

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

Trurl
источник
0

Баш 4:

shopt -s globstar
for file in **; do [[ -f "$file" ]] && mv "$file" .; done
ата
источник
-2

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

mv *.* subdir/
mv .* subdir/
Гильермо
источник
-2

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

mv **/*.* .

Пол Диги
источник
1
Это не найдет файлы, которые не имеют .в своем имени, не так ли?
G-Man говорит: «Восстановите Монику»