2012-02-09 5 views
2

Я хотел бы использовать find внутри подстановки команд, где возвращаемые имена файлов содержат пробелы. Какой параметр мне нужен, чтобы он правильно цитировал имена файлов? Я пробовал -print0, но он не будет работать в самой оболочке.Использование find (1) в подстановке команд и цитировании имен файлов с пробелами

пример:

command $(find . -type f) some other params 

Я также попытался с -exec echo "{}" \;, но это не поможет ни.


Если я использую set -x для отображения расширения оболочки и фактической команды, которая выполняется я получаю:

$ command `find -type f -printf \"%p\"\ ` some other params 
++ find -type f -printf '"%p" ' 
+ command '"./file_with' 'blanks"' '"./another' 'file"' some other params 

Где одинарные кавычки, приезжающие и почему они применяются к каждому «слову» ?

+0

Знаешь о xargs? 'найти. -тип f -print0 | xargs -0 yourCmd выбирает'? xargs будет «подавать» N количество выходов из find в 'yourCmd' и продолжать повторяться до тех пор, пока не будет выполнен весь вывод. Xargs - предпочтительный способ передать вывод вывода команде в GnuLinux (не так много в старой Unix Solaris/HP/etc). Может быть что-то о 'yourCmd', которое мешает этому работать, но выше - это место для начала. Удачи. – shellter

+0

Я знаю 'xargs' (должен был упомянуть в вопросе), но команда должна выполняться только один раз, а не один раз для каждого входного файла. Мне нужен полный список файлов, переданный команде за один шаг. (пробовал '-L' и' -n' из xargs) – knittl

+0

моя точка в отношении «xargs будет подавать N количество выходных данных» означает, что xargs будет выставлять yourCmd с таким количеством аргументов, которое может поместиться при одном выполнении командной строки И только повторить yourCmd, если необходимо (и столько раз, сколько необходимо). правильно? Если вам нужно обработать 100000 файлов, использование 'yourCmd $ (find. -type f)' будет работать, вы получите сообщение msg как «слишком много имен файлов» Xargs призван помочь решить эту проблему, выполнив команду yourCmd как можно меньше. Учитывая список из 10 файлов через xargs, yourCmd будет работать только 1 раз, а не 10 x. Удачи. – shellter

ответ

3

Поместите find result in an array и запустить command "${array[@]}" some other params.

+0

' command '$ {array [@]} "some другие параметры, наконец, сделали трюк для меня. Но мальчик, это более чем сложно ... – knittl

+0

К сожалению, Bash - это один из языков, где пробелы чрезвычайно сложны, если вы хотите правильно его обрабатывать во всех случаях. – l0b0

-1
find /what/ever -name "what ever" -exec echo "\{\}" \; 

работы здесь (Ubuntu 10.04 по умолчанию gterm с Баш)

Просто попытался

find /bin -name ls -exec \{\} -lah \; 
`find /bin -name ls -exec echo \{\} \;` -lah 
MYCMD=`find /bin -name ls -exec echo \{\} \;` && $MYCMD -lah 
MYCMD=$(`find /bin -name ls -exec echo \{\} \;` -lah) && echo $MYCMD 
MYCMD=$(`find /bin -name ls` -lah) && echo $MYCMD 

все работы, как ожидается,

+0

»Не удалось открыть файл: \ {\}«. Командная замена добавляет другой результат цитирования к результату, которого я боюсь ... – knittl

+0

Отредактированный мой ответ –

+0

'/ bin/sh' не содержит смешных (пробельных) символов ... – knittl

0

Возможно printf действие более восприимчивыми к тому, содержится в замещении (GNU find только, хотя):

command $(find . -type f -printf \"%P\"\) some other params 

%P заполнитель имя файла минус аргумент find, так и в других, чем find . случаях , вы, скорее всего, захотите %p.

 Смежные вопросы

  • Нет связанных вопросов^_^