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-е действие) большое спасибо.