Использование find (1) в подстановке команд и кавычки имен файлов с пробелами - PullRequest
2 голосов
/ 09 февраля 2012

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

пример:

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

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

Ответы [ 3 ]

3 голосов
/ 09 февраля 2012

Поместите результат поиска в массив и выполните command "${array[@]}" some other params.

0 голосов
/ 09 февраля 2012

Может быть, действие printf более поддается содержанию в подстановке (только GNU find):

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

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

0 голосов
/ 09 февраля 2012
find /what/ever -name "what ever" -exec echo "\{\}" \;

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

Только что попробовал

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

все работает как положено

...