Utilice el resultado del comando buscar para luego eliminar un directorio específico

Utilice el resultado del comando buscar para luego eliminar un directorio específico

Cuando ejecuto este comando de búsqueda:

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

obtengo un resultado como este:

/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

Mi objetivo es eliminar una carpeta de "miniaturas" que existe en cada uno de estos directorios (es decir, eliminar esta carpeta: /html/car_images/inventory/16128/thumbnails/ y también borrar/html/car_images/inventory/16115/thumbnails/

Quizás estoy pensando en un script que tome cada línea de salida del comando de búsqueda anterior y luego reemplace "*.jpg" con "miniaturas" y agrega como prefijo "rm -fr" de modo que termino con esto:

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

etcétera...

¿Alguna idea sobre cómo hacer esto? (¿Quizás usando la opción -exec de buscar y sed o cortar?)

(otra forma de expresar mi objetivo es, si una carpeta contiene un archivo .jpg que es "más reciente" que X días, eliminar la carpeta "miniaturas" en su carpeta)

Respuesta1

Suponiendo que no tiene nombres de archivos con nuevas líneas:

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
  • La expansión del parámetro ${1%/*}extrae la parte sin el nombre de archivo de cada entrada encontrada.

  • sort -uordena y luego hace que las entradas sean únicas para que no tengamos ningún duplicado

  • xargs -I{} rm -r {}/thumbnailsagrega thumbnailsal final y luego elimina el directorio resultante

Respuesta2

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)

Esto se completa utilizando una sustitución de proceso dentro de una sustitución de proceso.

Encuentra archivos según criterios OP, obtiene el nombre de directorio de cada archivo jpg en un bucle while, clasifica y elimina duplicados (inspirado en @heemayl), luego lo lee en un bucle while para eliminar el directorio de miniaturas.

información relacionada