Find -exec с несколькими командами
Я пытаюсь использовать find -exec с несколькими командами без каких-либо успехов. Кто-нибудь знает, возможны ли такие команды, как:
find *.txt -exec echo "$(tail -1 '{}'),$(ls '{}')" \;
В основном, я пытаюсь напечатать последнюю строку каждого txt файла в текущем каталоге и напечатать в конце строки, запятую, за которой следует имя файла.
Ответы
Ответ 1
find
принимает несколько команд -exec
к команде. Например:
find . -name "*.txt" -exec echo {} \; -exec grep banana {} \;
Обратите внимание, что в этом случае вторая команда будет выполняться только в том случае, если первая успешно вернется, как указано @Caleb. Если вы хотите, чтобы обе команды запускались независимо от их успеха или неудачи, вы можете использовать эту конструкцию:
find . -name "*.txt" \( -exec echo {} \; -o -exec true \; \) -exec grep banana {} \;
Ответ 2
find . -type d -exec sh -c "echo -n {}; echo -n ' x '; echo {}" \;
Ответ 3
Одно из следующего:
find *.txt -exec awk 'END {print $0 "," FILENAME}' {} \;
find *.txt -exec sh -c 'echo "$(tail -n 1 "$1"),$1"' _ {} \;
find *.txt -exec sh -c 'echo "$(sed -n "\$p" "$1"),$1"' _ {} \;
Ответ 4
Другой способ:
multiple_cmd() {
tail -n1 $1;
ls $1
};
export -f multiple_cmd;
find *.txt -exec bash -c 'multiple_cmd "$0"' {} \;
в одной строке
multiple_cmd() { tail -1 $1; ls $1 }; export -f multiple_cmd; find *.txt -exec bash -c 'multiple_cmd "$0"' {} \;
- "
multiple_cmd()
" - это функция
- "
export -f multiple_cmd
" - будет экспортировать его, чтобы любая другая подоболочка могла его видеть
- "
find *.txt -exec bash -c 'multiple_cmd "$0"' {} \;
" - найдите, что будет выполнять функцию в вашем примере
Таким образом, multiple_cmd может быть таким же сложным, насколько вам нужно.
Надеюсь, что это поможет.
Ответ 5
Там проще:
find ... | while read -r file; do
echo "look at my $file, my $file is amazing";
done
В качестве альтернативы:
while read -r file; do
echo "look at my $file, my $file is amazing";
done <<< "$(find ...)"
Ответ 6
Я не знаю, можете ли вы сделать это с помощью find, но альтернативным решением было бы создать оболочку script и запустить ее с помощью find.
lastline.sh:
echo $(tail -1 $1),$1
Сделайте исполняемый файл script
chmod +x lastline.sh
Используйте find
:
find . -name "*.txt" -exec ./lastline.sh {} \;
Ответ 7
1-й ответ Дениса - это ответ на решение проблемы. Но на самом деле это не более находка с несколькими командами только в одном exec, как и название. Чтобы ответить на один exec с помощью нескольких команд, нам придется искать что-то еще для resolv. Вот пример:
Сохраните последние 10000 строк .log файлов, которые были изменены за последние 7 дней, используя команду exec, используя команды [} ссылки
1) посмотрите, что команда будет делать с файлами:
find / -name "*.log" -a -type f -a -mtime -7 -exec sh -c "echo tail -10000 {} \> fictmp; echo cat fictmp \> {} " \;
2) Сделайте это: (обратите внимание на "\ > ", но только " > " это требуется)
find / -name "*.log" -a -type f -a -mtime -7 -exec sh -c "tail -10000 {} > fictmp; cat fictmp > {} ; rm fictmp" \;
Ответ 8
Благодаря Камило Мартину я смог ответить на соответствующий вопрос:
То, что я хотел сделать, было
find ... -exec zcat {} | wc -l \;
который не работал. Однако
find ... | while read -r file; do echo "$file: `zcat $file | wc -l`"; done
действительно работает, поэтому спасибо!
Ответ 9
должен использовать xargs:)
find *.txt -type f -exec tail -1 {} \; | xargs -ICONSTANT echo $(pwd),CONSTANT
другой (работает на osx)
find *.txt -type f -exec echo ,$(PWD) {} + -exec tail -1 {} + | tr ' ' '/'
Ответ 10
Ответ find+xargs
.
Пример ниже находит все файлы .html
и создает копию с добавленным расширением .BAK
(например, 1.html
> 1.html.BAK
).
Одна команда с несколькими заполнителями
find . -iname "*.html" -print0 | xargs -0 -I {} cp -- "{}" "{}.BAK"
Несколько команд с несколькими заполнителями
find . -iname "*.html" -print0 | xargs -0 -I {} echo "cp -- {} {}.BAK ; echo {} >> /tmp/log.txt" | sh
Эта команда также будет работать с файлами, которые начинаются с дефиса или содержат пробелы, такие как -my file.html
, благодаря цитированию параметров и --
после cp
, который сигнализирует cp
об окончании параметров и начале фактические имена файлов.
-print0
pipes the results with null-byte terminators.
для xargs параметр -I {}
определяет {}
в качестве заполнителя; вы можете использовать любой заполнитель, который вам нравится; -0
указывает, что входные элементы разделены нулями.
Ответ 11
может кто-то здесь помочь мне; Я хотел бы составить действие в crontab с одним условием дать 2 или 3 действия. это означает, что когда я нашел файл (условие), он будет загружен с помощью Dropbox Uploader (1-е действие) и будет удален из папки (2-е действие) большое спасибо.