Как я могу выполнить несколько выражений, используя опцию -exec в Linux с помощью команды find?

0

Я прочитал пост в Как я могу выполнить несколько команд при использовании find? , Если я неправильно понял предоставленный ответ, я не верю, что он обеспечивает решение, которое я ищу.

Мое требование - найти определенный набор файлов. Если найдено, то создайте каталог. Если каталог был успешно создан только тогда, чтобы извлечь файлы. После извлечения удалить исходные файлы. Как я смогу добиться этого?

PeanutsMonkey
источник
2
Почему вы не используете -execдля вызова сценария делать сложные вещи?
Nifle
@Nifle - Разве я не могу просто найти код состояния успеха, -execнапример, если 0, тогда что-то сделать?
PeanutsMonkey

Ответы:

3

Ссылка, которую вы публикуете, дает «правильный» ответ, на мой взгляд. Просто порождайте раковину. Без этого у вас не будет достаточно большого набора инструментов. Вы можете создать команду поиска в псевдокоде, например:

find /path -criteria -exec mkdir {} \; -exec extract {} \; -exec rm {} \;

Это остановит любую ошибку, так как предикаты естественным образом объединены. Но это дает вам недостаточный контроль над наименованием каталога. Это гарантированно потерпит неудачу.

Создание оболочки решает эту проблему, так как у вас будет весь язык оболочки:

find /path -criteria -exec /bin/sh '
    for d; do
        mkdir "${d##*/}" && tar xvf "$d" && rm "$d"
    done' _ {} +

Обратите внимание, что эта версия имеет побочный эффект продолжения ошибки при любой итерации цикла - она ​​порождает единую оболочку для всех результатов. Я бы посоветовал вызывать оболочку с флагом -e, если вы хотите решительно остановиться на любой ошибке.

falconindy
источник
Могу я спросить, что означают магические символы _ и + в конце?
STIB
1
@stib: Подчеркивание - это argv [0] для процесса / bin / sh. Это бессмысленно (это может быть что угодно). «{} +» - это синтаксис поиска для «добавить все результаты в качестве аргументов в программу -exec» - argv [1] .. argv [n]. Он порождает один процесс для всех результатов, а не порождает отдельные процессы для каждого результата, как вы могли бы получить, используя "{} \;".
соколиная охота