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

9

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

echo Blah: `stat -c %a .`

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

RomanSt
источник
1
Обратные пометки не могут работать там, потому что они оцениваются один раз, прежде чем findдаже выполняется, и результат используется в качестве статического параметра для поиска.
Свен

Ответы:

10

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

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

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

Приостановлено до дальнейшего уведомления.
источник
6

Зачем?

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

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

 find . -exec bash -c 'echo Blah: `stat -c %a {}`' \;
Игнасио Васкес-Абрамс
источник
Спасибо за решение моей непосредственной проблемы, но мне все еще интересно узнать, можно ли использовать обратные пометки, как описано. Просто чтобы расширить мои горизонты.
RomanSt
Вы должны были бы вызвать оболочку через bash -cили подобное.
Игнасио Васкес-Абрамс
0

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

Хьюберт Карио
источник
0

Не забывайте 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"

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

MattBianco
источник
Я ценю усилия, но мне нужны эти неприятности. Очевидно, мой пример упрощен и использует echo + stat; настоящий сценарий не использует ни echo, ни stat, поэтому ваш трюк по объединению их в строку формата stat совсем не помогает.
RomanSt