Обратные пометки не могут работать там, потому что они оцениваются один раз, прежде чем findдаже выполняется, и результат используется в качестве статического параметра для поиска.
Свен
Ответы:
10
Лучший способ сделать это - использовать позиционные параметры. И $()является предпочтительным для команды замещение Ove обратных кавычек , потому что это более читаемой (не путать с одинарными кавычками) и может быть легко вложенными без необходимости делать много побега.
Спасибо за решение моей непосредственной проблемы, но мне все еще интересно узнать, можно ли использовать обратные пометки, как описано. Просто чтобы расширить мои горизонты.
RomanSt
Вы должны были бы вызвать оболочку через bash -cили подобное.
Игнасио Васкес-Абрамс
0
Единственный способ их использования (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"
(Попробуйте это на большой файловой системе на медленном компьютере и оцените разницу!)
Я ценю усилия, но мне нужны эти неприятности. Очевидно, мой пример упрощен и использует echo + stat; настоящий сценарий не использует ни echo, ни stat, поэтому ваш трюк по объединению их в строку формата stat совсем не помогает.
find
даже выполняется, и результат используется в качестве статического параметра для поиска.Ответы:
Лучший способ сделать это - использовать позиционные параметры. И
$()
является предпочтительным для команды замещение Ove обратных кавычек , потому что это более читаемой (не путать с одинарными кавычками) и может быть легко вложенными без необходимости делать много побега.Подчеркивание является заполнителем для
$0
.источник
Зачем?
Или используйте,
bash -c
если вам действительно нужно:источник
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"
(Попробуйте это на большой файловой системе на медленном компьютере и оцените разницу!)
источник