Когда я запускаю эту команду 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, чтобы удалить каталог миниатюр.