cp recursief met specifieke bestandsextensie

Ik probeer alle .odt -bestanden inclusief die in submappen.

cp -r ~/Documents/* ~/copies # works as expected
cp -r ~/Documents/*.odt ~/copies # does not work as expected

De eerste regel zal alle bestanden en in alle submappen kopiëren, maar de tweede zal alleen de .odt -bestanden in ~ / Documents kopiëren en geen van de bestanden in de submappen.

9
задан 16 December 2020 в 17:34

2 ответа

Если вы хотите воспроизвести структуру каталогов (больше похоже на то, что cp -r делает, как было предложено steeldriver), но заполните ее только .odt файлов, вы можете сделать это с помощью rsync , где -f - это параметр «фильтр». Остальные варианты более просты. Все параметры можно найти в man rsync .

rsync -nvr -f '+ *.odt' -f '+ **/' -f '- *' --prune-empty-dirs ~/Documents/ ~/copies/

Рекомендуется использовать параметр «пробный запуск» -n и параметр подробного описания -v , чтобы увидеть, что будет сделано перед запуском настоящей команды (когда n удаляется из командной строки).

6
ответ дан 3 January 2021 в 22:46

Вместо этого вы можете позволить оболочке (bash) выполнить рекурсию:

shopt -s globstar
cp -nt ~/copies/ ~/Documents/**/*.odt

или использовать команду find

find ~/Documents -name '*.odt' -exec cp -nt ~/copies/ {} +

Первая может превысить системные ограничения ARG_MAX , если число if файлы очень большие, в то время как последний прерывает команду, чтобы оставаться в пределах ARG_MAX .

Я добавил параметр -n , чтобы предотвратить «затирание» файлов с тем же именем.

16
ответ дан 3 January 2021 в 22:46

Другие вопросы по тегам:

Похожие вопросы: