Используйте вывод команды find, чтобы удалить определенный каталог

Используйте вывод команды find, чтобы удалить определенный каталог

Когда я запускаю эту команду find:

find /html/car_images/inventory/ -type f -iname \*.jpg -mtime -4

я получаю такой вывод:

/html/car_images/inventory/16031/16031_06.jpg
/html/car_images/inventory/16117/16117_01.jpg
/html/car_images/inventory/16126/16126_01.jpg
/html/car_images/inventory/16115/16115_01.jpg
/html/car_images/inventory/16128/16128_02.jpg
/html/car_images/inventory/16128/16128_03.jpg
/html/car_images/inventory/16128/16128_04.jpg

Моя цель — удалить папку «миниатюра», которая существует в каждом из этих каталогов (т.е. удалить эту папку: /html/car_images/inventory/16128/миниатюры/ и также удалить/html/car_images/inventory/16115/миниатюры/

Я думаю, возможно, о скрипте, который берет каждую строку вывода из приведенной выше команды find, а затем заменяет "*.jpg" с "thumbnails" и добавляет в качестве префикса "rm -fr", так что в итоге получается следующее:

rm -fr /var/www/html/car_images/inventory/16115/thumbnails/
rm -fr /var/www/html/car_images/inventory/16128/thumbnails/

и так далее...

Есть идеи, как это сделать? (возможно, используя опцию -exec команды find и sed или cut?)

(еще один способ сформулировать мою цель таков: если папка содержит файл .jpg, который «моложе» X дней, то удалите папку «thumbnails» в этой папке)

решение1

Предположим, что у вас нет имен файлов с символами новой строки:

find /html/car_images/inventory/ -type f -iname \*.jpg -mtime -4 \
     -exec sh -c 'echo "${1%/*}"' _ {} \; | sort -u | \
          xargs -d $'\n' -I{} rm -r {}/thumbnails
  • Расширение параметра ${1%/*}извлекает часть без имени файла из каждой найденной записи.

  • sort -uсортирует и затем делает записи уникальными, чтобы не было дубликатов

  • xargs -I{} rm -r {}/thumbnailsдобавляет thumbnailsв конец, а затем удаляет полученный каталог

решение2

while read dir;
  do
    rm -r "$dir"/thumbnails;
done < <(while read file; do dirname "$file"; done < <(find /html/car_images/inventory/ -type f -iname \*.jpg -mtime -4) | sort -u)

Это выполняется с помощью подстановки процесса внутри подстановки процесса.

Он находит файлы на основе критериев OP, получает имя каталога каждого файла jpg в цикле while, сортирует и удаляет дубликаты (вдохновлено @heemayl), затем считывает его в цикле while, чтобы удалить каталог миниатюр.

Связанный контент