Wiki

Clone wiki

comp-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