Вот команда, которая отлично работает:
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"
(Попробуйте его на большой файловой системе на медленном компьютере и измерьте разницу!)