Я хочу рекурсивно искать каталог и копировать все файлы XML в новое место. Я могу идентифицировать файлы с:

ls -R | grep .xml$

или с полными путями с:

find . -name \*.xml

Результаты обычных вызовов ls могут быть переданы в cp следующим образом:

cp `ls` ./newdir

Но я не могу заставить этот подход работать с рекурсивными поисками - cp неправильно читает результирующую строку grep и создает много пустых файлов. Самый близкий вопрос SU - использование locate - не может переместить какие-либо файлы.


Редактировать:

Альтернативный метод:

find . -name \*.xml > xml_list.txt
while read p; do   cp $p ./newdir; done <xml_list.txt

.. приводит к списку ошибок (длиннее, чем количество строк) в формате:

cp: pathfilenamesegment: No such file or directory

.. где pathfilenamesegment - это сегменты строк файла / пути, которые разделены пробелами. Bash, по-видимому, использует строки не как целые, а как сегменты. Однако итератор работает правильно, так как замена echo 1 печатает столько же раз, сколько строк в xml_list.txt .

Есть ли способ заставить bash распознавать строки как целые строки?

1 ответ1

2

Используйте find:

find . -name "*.xml" -exec cp -vt /newdir {} +

Это ищет все файлы, заканчивающиеся на .xml . Затем find выполняет над ними cp -vt /newdir . С помощью символа + команда find запускает команду cp как можно меньше вызовов, объединяя столько аргументов, сколько позволяет оболочка.

Редактировать: если ваш cp не имеет опции -t , используйте это:

find . -name "*.xml" -exec cp -v {} /newdir/ \;

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .