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 encontradasort -u
classifica e torna as entradas exclusivas para que não tenhamos nenhuma duplicataxargs -I{} rm -r {}/thumbnails
adicionathumbnails
no 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.