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


9

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

echo Blah: `stat -c %a .`

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


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"

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


Я ценю усилия, но мне нужны эти неприятности. Очевидно, мой пример упрощен и использует echo + stat; настоящий сценарий не использует ни echo, ни stat, поэтому ваш трюк по объединению их в строку формата stat совсем не помогает.
— RomanSt
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.