Use a saída do comando find para remover um diretório específico

Use a saída do comando find para remover um diretório específico

Quando executo este comando find:

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

eu recebo uma saída assim:

/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

Meu objetivo é excluir uma pasta "thumbnail" que existe em cada um desses diretórios (ou seja, excluir esta pasta: /html/car_images/inventory/16128/thumbnails/ e também excluir/html/car_images/inventory/16115/thumbnails/

Estou pensando talvez em um script que pegue cada linha de saída do comando find acima e substitua "*.jpg" com "miniaturas" e adiciona como prefixo "rm -fr" de modo que acabo com isto:

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

e assim por diante...

Algumas ideias em como fazer isso? (talvez usando a opção -exec de find e sed ou cut?)

(outra maneira de expressar todo o meu objetivo é, se uma pasta contiver um arquivo .jpg que seja "mais jovem" que X dias, exclua a pasta "miniaturas", em sua pasta)

Responder1

Supondo que você não tenha nomes de arquivos com novas linhas:

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
  • A expansão do parâmetro ${1%/*}extrai a parte sem o nome do arquivo de cada entrada encontrada

  • sort -uclassifica e torna as entradas exclusivas para que não tenhamos nenhuma duplicata

  • xargs -I{} rm -r {}/thumbnailsadiciona thumbnailsno final e, em seguida, remove o diretório resultante

Responder2

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)

Isso é concluído usando uma substituição de processo dentro de uma substituição de processo.

Ele encontra arquivos com base nos critérios OP, obtém o nome do diretório de cada arquivo jpg em um loop while, classifica e remove duplicatas (inspirado em @heemayl) e depois lê isso em um loop while para remover o diretório de miniaturas.

informação relacionada