Отойдите от ls, если это вообще возможно. Используйте find из пакета findutils.
find /target/path -type f -print0 | xargs -0 your_command_here
-print0
заставит find выводить имена, разделенные символами NUL (ноль ASCII). Аргумент -0
для xargs говорит, что он также должен ожидать аргументы, разделенные символами NUL, поэтому все будет работать нормально.
Замените /target/path
на путь, по которому находятся ваши файлы.
-type f
будет искать только файлы. Используйте -type d
для каталогов или вообще опустите, чтобы получить оба.
Замените your_command_here
командой, которую вы будете использовать для обработки имен файлов. (Примечание: если вы запустите это из оболочки, используя echo для your_command_here, вы получите все в одну строку - не запутайтесь в этом артефакте оболочки, xargs все равно сделает ожидаемую правильную вещь.)
Редактировать: В качестве альтернативы (или если у вас нет xargs), вы можете использовать гораздо менее эффективный
find /target/path -type f -exec your_command_here \{\} \;
\{\} \;
является экранированием для {} ;
, который является заполнителем для текущего обработанного файла. Затем find вызовет your_command_here
с заменой {} ;
на имя файла, и, поскольку your_command_here
будет запущен командой find, а не оболочкой, пробелы не будут иметь значения.
Вторая версия будет менее эффективной, так как find запустит новый процесс для каждого найденного файла. xargs достаточно умен, чтобы перенаправить команды во вновь запущенный процесс, если сможет понять, что это безопасно. Предпочитаю версию xargs, если у вас есть выбор.