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


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 \;


1
пожалуйста, не забудьте сделать резервную копию, прежде чем пытаться вышеуказанные команды :-).
Hemant

2
Кстати, для первого следует использовать -print0 для поиска и -0 для xargs, чтобы избежать пробелов в именах файлов.
maxschlepzig

@maxschlepzig: хорошая мысль. Я буду редактировать.
Hemant

2
Я настоятельно рекомендую использовать mv -iздесь, чтобы вы не рисковали перезаписывать файлы в случае непредвиденных ситуаций
Жиль "ТАК - перестань быть злым"

2
с помощью mv из gnu core utils вы можете использовать mv -t <targetdir>и + вместо \;


9

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

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

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

rsync -a --prune-empty-dirs --include='*/' --include='*.ogg' --exclude='*' /thisdir /somedir

за пределами удобного в Bash
Марк
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.