Як я можу переміщувати файли рекурсивно з каталогу та його підкаталогів до іншого каталогу?


30

Який би був хороший спосіб перемістити тип файлу з каталогу та всіх його підкаталогів?

Як-от "перемістити всіх * .ogg в / thisdir рекурсивно до / somedir". Я спробував пару речей; мої найкращі зусилля були (все ще не такі великі):

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

Він повертався в кожному рядку перед кожним іменем файлу,

mv: cannot overwrite non-directory `/thisdir/*.ogg' with directory `/somedir'

Відповіді:


23

ви можете використовувати find з 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
будь ласка, не забудьте зробити резервну копію перед тим, як спробувати вище команди :-).
Хемант

2
Btw, для першого -print0 для find і -0 для xargs слід використовувати якомога більше, щоб уникнути пробілів у проблемах з іменем файлу.
maxschlepzig

@maxschlepzig: хороший момент. Я відредагую.
Хемант

2
Настійно пропоную використовувати mv -iтут, тому ви не ризикуєте перезаписувати файли, якщо трапиться щось несподіване.
Жил 'ТАК - перестань бути злим'

2
з mv від утиліти gnu core ви можете використовувати mv -t <targetdir>та + замість \;


9

У zsh або bash 4 зібрати всі *.oggфайли у /somedir:

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

Якщо ви хочете відтворити ієрархію каталогів: (попередження, введене безпосередньо у браузер)

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

поза зручним у баші
Марк
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.