Wiki
Clone wikicomp-house.repo / processing-filenames-with-space
Пакетная обработка файлов с пробелами в имени.
Общеизвестно, что имена с пробелами необходимо брать в кавычки. Но что делать, если список файлов формируется пакетом, например, утилитой find?
Общеизвестно, что имена с пробелами необходимо брать в кавычки. Но что делать, если список файлов формируется пакетом, например, утилитой find?
Пример, имеем два файла - "test" и "te st"
$ ls -1 test te st
Попробуем списком передать их команде ls:
find ./ -name "t*" | xargs ls ls: невозможно получить доступ к ./te: Нет такого файла или каталога ls: невозможно получить доступ к st: Нет такого файла или каталога ./test
Проблема очевидна, пробел в имени совпадает с разделителем аргументов. Решение простое - и find и xargs умеют создавать и принимать список аргументов, разделеных нуль-байтом.
$ find ./ -name "t*" -print0 | xargs -0 ls ./test ./te st
Есть и другое решение, воспользоваться стандартным операндом -exec:
$ find ./ -name "t*" -exec ls "{}" \;
Но это решение имеет существенный недостаток, вместо запуска одного процесса со списком, на каждый файл исполняемая команда будет вызываться отдельно, что может значительно снизить скорость работы.
Updated