Ответы:
Лучший способ сделать это - использовать позиционные параметры. И $()
является предпочтительным для команды замещение Ove обратных кавычек , потому что это более читаемой (не путать с одинарными кавычками) и может быть легко вложенными без необходимости делать много побега.
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 {}`' \;
bash -c
или подобное.
Единственный способ их использования (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"
(Попробуйте это на большой файловой системе на медленном компьютере и оцените разницу!)
find
даже выполняется, и результат используется в качестве статического параметра для поиска.