В unix я хочу скопировать все файлы с определенным расширением (все файлы Excel) из всех подкаталогов в другой каталог. У меня есть такая команда:
cp --parents `find -name \*.xls*` /target_directory/
Проблемы с этой командой:
Он также копирует структуру каталогов, и мне нужны только файлы (поэтому все файлы должны находиться в / target_directory /)
Он не копирует файлы с пробелами в именах файлов (а их довольно много)
Какие решения этих проблем?
find... exec mv
?Ответы:
--parents
копирует структуру каталогов, поэтому вам следует избавиться от этого.То, как вы это написали,
find
выполняет, а вывод помещается в командную строку, так чтоcp
не может различить пробелы, разделяющие имена файлов, и пробелы внутри имени файла. Лучше сделать что-нибудь вродев котором
cp
выполняется для каждого найденногоfind
имени файла и правильно передано имя файла. Подробнее об этой технике.Вместо всего вышеперечисленного вы можете использовать zsh и просто ввести
zsh
может расширять подстановочные знаки, чтобы включать подкаталоги, что очень упрощает подобные вещи.источник
Bash
4.0+, аksh93
также поддерживает**
. Для bash используйте,shopt -s globstar
чтобы включить его. Для ksh этоset -G
илиset -o globstar
.find . -name '*.xls' -print0 | xargs -0 cp -t destdir
Из всего вышеперечисленного я придумал эту версию. Эта версия также работает у меня в терминале восстановления Mac.
Он будет искать файлы с расширением xsl в текущем каталоге и рекурсивно во всех подкаталогах. Он скопирует их все в целевой каталог.
cp флаги:
источник
У меня была похожая проблема. Я решил это, используя:
'{}'
И";"
выполняет копию на каждый файл.источник
Мне тоже пришлось это делать самому. Я сделал это с помощью аргумента --parents для cp:
источник
вы можете удалить параметр --parents, но существует риск коллизии, если несколько файлов имеют одно и то же имя.
источник