Busca recursivamente arquivos terminando com o padrão especificado

1

Eu tenho muitas pastas com arquivos que terminam com "-105x135.jpg", "-410x410.jpg" etc., "780-105x135.jpg" e "candyswing-2-klein-ohrringe-schale-038- 135x160.jpg "por exemplo, que eu preciso encontrar e excluir, usando regex on-line Eu criei esse padrão: [0-9]x..[0-9].jpg , mas find . -regex '[0-9]x..[0-9].jpg' não mostrou nenhum resultado.

    
por Mike 09.03.2018 / 10:47

2 respostas

0

De acordo com a página man , a opção -regex é uma correspondência no caminho inteiro , por exemplo. o todo nome do arquivo e também a parte inteira do diretório-caminho, então você precisaria preceder seu regex com .* . Existem vários exemplos explícitos na página man .

Além disso, tenha em mente a opção -regextype . O padrão (por man page) é emacs , mas outras opções são posix-awk , posix-basic , posix-egrep e posix-extended . Bata você mesmo.

    
por 09.03.2018 / 10:58
1

Outra opção seria usar a opção globstar do bash:

shopt -s globstar

para listar:

ls **/*[0-9][0-9][0-9]x[0-9][0-9][0-9].jpg

ou remova:

rm **/*[0-9][0-9][0-9]x[0-9][0-9][0-9].jpg

os arquivos.

O padrão glob acima é ligeiramente diferente do que o regex que você forneceu; o regex permitiria qualquer dois caracteres após o x , não estritamente números. Em outras palavras, um arquivo chamado: somefile-135xyz9.jpg corresponderia à regex, mas não à glob. Acima.

O glob recursivamente ( ** ) corresponde a arquivos que:

  • inicie com qualquer coisa ( * )
  • tem três números (três [0-9] )
  • seguido por um x
  • seguido por três números
  • seguido por .jpg

Um risco para essa abordagem é se / quando o número de arquivos correspondentes excede o espaço de argumento da linha de comando. Nesse caso, você pode salvar os nomes de arquivos em uma matriz e, em seguida, percorrer a matriz individualmente.

Para investigar:

files=(**/*[0-9][0-9][0-9]x[0-9][0-9][0-9].jpg)
for file in "${files[@]}"; do echo Would: rm -- "$file"; done

Para remover:

files=(**/*[0-9][0-9][0-9]x[0-9][0-9][0-9].jpg)
for file in "${files[@]}"; do rm -- "$file"; done
    
por 09.03.2018 / 11:52