Apagar recursivamente arquivos com 'WIDTHxLENGTH' no nome em um diretório

2

Eu tenho um diretório com subdiretórios e desejo excluir imagens nomeadas como thumbnail-name_WIDTHxLENGTH.{jpg,png} , em que WIDTH e LENGTH são números inteiros decimais, como box-image-150x150.jpg e circle-image-320x320.png . Então basicamente é qualquer jpg / png que contém um x rodeado de dígitos.

    
por fer 27.10.2015 / 18:33

3 respostas

2

# Old school way for directory-walking: find (emacs regex; use '(jpg|png)' on BSD find)
# use -iregex for case-insensitive
find some/dir -regex '.*[0-9]+x[0-9]+.\(jpg\|png\)' -delete
# ksh93, zsh & bash: globstar + brace expansion + extglob
# for ksh, use 'set -o globstar' first; for bash, use 'shopt -s globstar extglob nullglob' first.
# TODO: Too lazy to write zsh cshnullglob and case-insensitive globs
rm -- **/*[0-9]x+([0-9]).{jpg,png}
    
por 27.10.2015 / 20:11
1

O termo "expressão regular" (geralmente) não se aplica para selecionar arquivos na linha de comando. 1 O termo técnico é expansão do nome do caminho, mais comumente conhecido como globbing, correspondência de padrões ou expansão com curinga. Com base no que você disse, uma primeira tentativa de resposta seria

rm -- *[0-9]x[0-9]*

que remove todos os arquivos no diretório atual cujo nome consiste em

  • qualquer coisa ( * ), seguido por
  • um dígito ( [0-9] ), seguido por
  • a letra x , seguida por
  • outro dígito ( [0-9] ), seguido por
  • qualquer coisa ( * ).

O -- protege você contra arquivos cujos nomes começam com - . Eu recomendo strongmente que você faça

ls -ld -- *[0-9]x[0-9]*

primeiro, para ver quais arquivos são correspondidos e serão removidos. Se você descobrir que está combinando arquivos que não queria, use *[0-9][0-9][0-9]x[0-9][0-9][0-9]* para obter apenas arquivos que contenham (pelo menos) um número de três dígitos, x e outro número de três dígitos. E / ou acrescentar .jpg (no final; por exemplo, usar *[0-9]x[0-9]*.jpg ) para restringir o comando aos arquivos com essa extensão, e repita o comando com .png . Como alternativa, use

rm -i -- *[0-9]x[0-9]*

para que rm solicite a confirmação de cada arquivo.

Você mencionou "um diretório que possui diretórios. Todos eles têm jpgs. Se você precisar pesquisar uma árvore de diretórios, uma abordagem é digitar

shopt -u globstar

e, em seguida, prefixar **/ ao curinga; isto é, adicione-o no começo; por exemplo,

rm -i -- **/*[0-9]x[0-9]*

No entanto, outra maneira de verificar uma árvore de subdiretórios é

find . -name "*[0-9]x[0-9]*" -type f -exec rm -i -- {} +

e você pode "visualizar" este comando (veja quais arquivos ele irá corresponder) digitando

find . -name "*[0-9]x[0-9]*" -type f -print

Novamente, se isso corresponder a muitos arquivos, você pode adicionar dígitos e / ou adicionar a (s) extensão (s).

Notas:

  • Você deve citar o curinga no comando find . Você não deve citar o curinga nos outros comandos.
  • O comando find localizará automaticamente os arquivos cujos nomes começam com . . Os outros não, a menos que você digite shopt -s dotglob primeiro.
  • O comando find atuará somente em arquivos simples, devido ao -type f . Os outros irão atuar em diretórios (e outros arquivos especiais) se o nome deles contiver numberxnumber . Isso não deve ser um problema para diretórios desde rm não irá remover diretórios. Mas, como eu disse, faça o ls primeiro e verifique cuidadosamente a saída, ou use rm -i e pense antes de digitar y .

por 27.10.2015 / 20:52
0

Use find com xargs:

find / -name "*[0-9]*x*[0-9]*.jpg" | xargs /bin/rm -f

EDITAR:

find / -name "*[0-9]x[0-9]*.jpg" | xargs /bin/rm -f

ou como 'authur2e5' sugerido nos comentários abaixo:

find some/dir -name "*[0-9]x[0-9]*.jpg" -delete
    
por 27.10.2015 / 19:56