Назад | Перейти на главную страницу

Можно ли получить обратные кавычки «find -exec» для каждого найденного файла?

Вот команда, которая отлично работает:

echo Blah: `stat -c %a .`

Возможно ли получить find -exec выполнить то же самое для каждого найденного файла, с {} на месте .?

Лучший способ сделать это - использовать позиционные параметры. И $() является предпочтительный для подстановки команд над обратными кавычками, потому что он более читабелен (не путается с одинарными кавычками) и может быть легко вложен без необходимости делать много экранирования.

find . -exec bash -c 'echo Blah: $(stat -c %a "$@")' _ {} \;

Подчеркивание является заполнителем для $0.

Зачем?

find ... -printf 'Blah: %m\n'

Или используйте bash -c если вам действительно нужно:

 find . -exec bash -c 'echo Blah: `stat -c %a {}`' \;

Единственный способ использовать их (AFAIK) - поместить их в файл сценария bash и использовать сценарий в -exec. То же самое с $()

Не забывай xargs ! Ваш пример будет вызывать новый процесс оболочки для каждого найденного файла.

Я бы предпочел это:

find ... | xargs stat -c "Blah: %a"

find выводит список всего найденного, xargs читает список аргументов на stdin и выполняет свой параметр с этими аргументами в командной строке, создавая максимально длинную командную строку. Это работает, потому что stat, как и большинство других правильных команд / программ, принимает любое количество параметров. (сравнить ls, rm и echo например)

Если вы считаете, что абсолютно необходимо запускать новый процесс для каждого файла, используйте xargs -n 1 только пройти 1 параметр для каждой команды. Таким образом, вы можете имитировать такие неэффективные методы:

find ... | xargs -n 1 stat -c "Blah: %a"

(Попробуйте его на большой файловой системе на медленном компьютере и измерьте разницу!)