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

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

1 ответ1

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, если вы хотите решительно остановиться на любой ошибке.

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .