Use o comando output from find para remover um diretório específico

1

Quando eu executo este comando de localização:

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

eu recebo 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 "miniatura" existente em cada um desses diretórios (por exemplo, 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 usa cada linha de saída do comando find acima, depois substitui " *. jpg " por "thumbnails" e adiciona como um prefixo "rm -fr "de tal forma que acabo com isso:

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

e assim por diante ...

Alguma idéia de como fazer isso? (talvez usando a opção -exec de localizar e sed ou cortar?)

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

    
por James Gaul 02.10.2016 / 06:40

2 respostas

3

Supondo que você não tenha nomes de arquivo com nova (s) linha (s):

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 -u classifica e, em seguida, torna as entradas exclusivas para que não tenhamos duplicatas

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

por 02.10.2016 / 07:00
0
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 baseados em critérios OP, obtém o nome de cada arquivo jpg em um loop while, ordena e remove duplicatas (inspirado em @heemayl), e então lê isso em um loop while para remover o diretório thumbnail.

    
por 02.10.2016 / 07:49