Script shell para mover todas as imagens excluindo aquelas com tamanho no nome usando find?

2

Eu tenho um backup do servidor de um site WordPress que tem cerca de 1000 imagens no diretório de uploads. Quando uma imagem foi carregada através do WordPress, ela criaria vários tamanhos da imagem, como:

foobar.jpg
foobar-170x170.jpg
foobar-250x250.jpg

Estou familiarizado com o uso de find para mover todos os arquivos de um diretório e suas subpastas com algo como find . -mindepth 3 -type f -print -exec mv {jpe?g|png|gif} . \; , mas fiquei curioso para saber se uma exclusão ao longo das linhas de "não mover isso" pode ser adicionado. Eu gostaria de dar um padrão e, em seguida, excluir nomes de arquivos que contenham esse padrão. Algo como !(\d{2,5}x\d{2,5}\.(jpe?g|png|gif)) .

Idealmente, eu gostaria de fazer isso em um único comando sem executá-lo em um loop ou usar rm para excluir os arquivos depois de movê-los todos. Quaisquer sugestões melhores para reduzir vários comandos do terminal seriam ótimas.

    
por DᴀʀᴛʜVᴀᴅᴇʀ 23.11.2014 / 05:59

1 resposta

2

Você pode usar as expressões -not ou ! de find:

   -not expr
          Same as ! expr, but not POSIX compliant.

   ! expr True  if  expr  is false.  This character will also usually need
          protection from interpretation by the shell.

Então, para mover foobar.jpg , mas não os outros dois, você pode usar:

find . -mindepth 3 -type f -regex '.*.jpg\|.*.jpeg\|.*png\|.*gif' \
       -not -regex '.*[0-9]+x[0-9]+.*' -exec mv {} . \;

Você também pode fazer corresponder somente 2-5 dígitos de cada lado com

find . -mindepth 3  -type f -regextype posix-egrep \
       -regex '.*.jpg|.*.jpeg|.*png|.*gif' -not -regex '.*[^0-9][0-9]{2,5}x[0-9]{2,5}.*' 
    
por terdon 23.11.2014 / 14:43