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

30

Что было бы хорошим способом для перемещения типа файла из каталога и всех его подкаталогов?

Как "рекурсивно переместить все * .ogg в / thisdir в / somedir". Я попробовал пару вещей; мои лучшие усилия были (все еще не так велики):

find /thisdir -type f -name '*.ogg' -exec mv /somedir {} \;

Он возвращается в каждой строке перед каждым именем файла,

mv: cannot overwrite non-directory `/thisdir/*.ogg' with directory `/somedir'
Стив Бурдин
источник

Ответы:

23

Вы можете использовать найти с XARGS для этого

find /thisdir -type f -name "*.ogg" -print0 | xargs -0 -Imysongs mv -i mysongs /somedir

-I в приведенной выше команде сообщает xargs, какую строку замены вы хотите использовать (в противном случае она добавляет аргументы в конец команды).

ИЛИ
В вашей команде просто попробуйте переместить '{}' после mvкоманды.

find /thisdir -type f -name '*.ogg' -exec mv -i {} /somedir \;

Hemant
источник
1
пожалуйста, не забудьте сделать резервную копию, прежде чем пытаться вышеуказанные команды :-).
Hemant
2
Кстати, для первого следует использовать -print0 для поиска и -0 для xargs, чтобы избежать пробелов в именах файлов.
maxschlepzig
@maxschlepzig: хорошая мысль. Я буду редактировать.
Hemant
2
Я настоятельно рекомендую использовать mv -iздесь, чтобы вы не рисковали перезаписывать файлы в случае непредвиденных ситуаций
Жиль "ТАК - перестань быть злым"
2
с помощью mv из gnu core utils вы можете использовать mv -t <targetdir>и + вместо \;
10
find /thisdir -type f -name "*.ogg" -exec mv {} /somedir \;

Вы как бы поменялись аргументами для М.В.

Кодирующий район
источник
9

В zsh или bash 4 собрать все *.oggфайлы в /somedir:

mv /thisdir/**/*.ogg /somedir

Если вы хотите воспроизвести иерархию каталогов: (предупреждение, введенное прямо в браузере)

rsync -a --prune-empty-dirs --include='*/' --include='*.ogg' --exclude='*' /thisdir /somedir
Жиль "ТАК - прекрати быть злым"
источник
за пределами удобного в Bash
Марк