Я пытаюсь использовать find -exec с несколькими командами без какого-либо успеха. Кто-нибудь знает, возможны ли такие команды, как следующие?
find *.txt -exec echo "$(tail -1 '{}'),$(ls '{}')" \;
По сути, я пытаюсь напечатать последнюю строку каждого текстового файла в текущем каталоге и распечатать в конце строки запятую, за которой следует имя файла.
find
страницы руководства:There are unavoidable security problems surrounding use of the -exec option; you should use the -execdir option instead.
unixhelp.ed.ac.uk/CGI/man-cgi?findОтветы:
find
принимает несколько-exec
частей к команде. Например:Обратите внимание, что в этом случае вторая команда будет выполняться только в том случае, если первая команда вернется успешно, как упомянуто @Caleb. Если вы хотите, чтобы обе команды выполнялись независимо от их успеха или неудачи, вы можете использовать эту конструкцию:
источник
-n
в некоторых других ответах для подавления новой строки, сгенерированной echo, что удобно, если ваша вторая команда выдает только одну строку вывода, и вы хотите, чтобы их было легче читать.источник
... -exec bash -c ...
вместо... -exec sh -c ...
.{}
в код оболочки. См. Unix.stackexchange.com/questions/156008/…Одно из следующего:
источник
$0
. Попробуйте это с "foobar" вместо "_":find /usr/bin -name find -exec sh -c 'echo "[$0] [$1]"' foobar {} \;
- вывод: "[foobar] [/ usr / bin / find]".$0
обычно это имя программы (ARGV[0]
).sh -c
в одинарных кавычках, а не в двойных. В противном случае$1
это не в том объеме.'$1'
двойные кавычки, пока вы не используете переменную ("\$1"
). Вы также можете избежать других персонажей ("\""
).Другой способ таков:
в одну строку
multiple_cmd()
» - это функцияexport -f multiple_cmd
" - экспортирует его, чтобы любой другой подоболочек мог его увидетьfind *.txt -exec bash -c 'multiple_cmd "$0"' {} \;
» - найдите, что выполнит функцию на вашем примереТаким образом, multip_cmd может быть настолько длинным и сложным, насколько вам нужно.
Надеюсь это поможет.
источник
~/aaa$ acmd() { echo x \"$1\" x; }; export -f acmd; find . -exec bash -c 'acmd {}' \;
Есть более простой способ:
В качестве альтернативы:
источник
zcat $file | wc -l
"; сделано работает, так что спасибо!`
, чтобы использовать обратную косую черту следующим образом:\`
(тем не менее, это еще одна веская причина для использования$()
вместо).Я не знаю, сможете ли вы сделать это с помощью find, но альтернативным решением было бы создать сценарий оболочки и запустить его с помощью find.
lastline.sh:
Сделайте скрипт исполняемым
Используйте
find
:источник
1-й ответ Дениса - это решение проблемы. Но на самом деле это уже не находка с несколькими командами только в одном exec, как предполагает заголовок. Чтобы ответить на один exec несколькими командами, нам нужно искать что-то еще для разрешения. Вот пример:
Сохраните последние 10000 строк .log файлов, которые были изменены за последние 7 дней, используя 1 команду exec, используя несколько ссылок {}
1) посмотреть, что команда будет делать с какими файлами:
2) Сделайте это: (обратите внимание, не больше "\>", а только ">", это нужно)
find / -name "*.log" -a -type f -a -mtime -7 -exec sh -c "tail -10000 {} > fictmp; cat fictmp > {} ; rm fictmp" \;
источник
Благодаря Камило Мартину я смог ответить на связанный вопрос:
То, что я хотел сделать, было
который не работал. Однако,
работает, так что спасибо!
источник
Расширяя ответ @ Тинкер,
В моем случае мне нужно было сделать
command | command | command
внутри,-exec
чтобы напечатать и имя файла, и найденный текст в файлах, содержащих определенный текст.Я смог сделать это с:
результат:
источник
/dev/null
в качестве второго аргументаgrep
команду с одним-exec
параметром:find . -name config -type f -exec grep "bitbucket" {} /dev/null \;
следует использовать xargs :)
еще один (работает на OSX)
источник
find
ситуаций, когда количество подходящих файлов слишком велико для командной строки.-exec
это способ обойти этот предел. Выпуск к коммунальной службе пропускает ту выгоду.xargs -n
существует для выбора количества совпадений на один вызов.xargs -n 1 foocmd
будет выполнятьfoocmd {}
для каждого матча.find+xargs
Ответ.Пример ниже находит все
.html
файлы и создает копию с.BAK
добавленным расширением (например,1.html
>1.html.BAK
).Одна команда с несколькими заполнителями
Несколько команд с несколькими заполнителями
Эта команда также будет работать с файлами, которые начинаются с дефиса или содержат пробелы, например, в
-my file.html
кавычках параметров и--
после,cp
которые указываютcp
на конец параметров и начало фактических имен файлов.источник