excluir padrão de correspondência de arquivos

32

Preciso remover recursivamente todos os arquivos em todos os subdiretórios em que o nome do arquivo contém um número seguido de um 'x' seguido de um número, pelo menos duas vezes.

Exemplo:

Eu gostaria de remover esses arquivos:

'aaa-12x123-123x12.jpg'
'aaa-12x12-123x12-12x123.jpg'

Mas NÃO quero remover esses arquivos:

'aaa.jpg'
'aaa-12x12.jpg'
'aaaxaaa-123x123.jpg'
'aaaxaaa-aaaxaaa.jpg'

Como posso fazer isso (a partir do shell bash)

mikkelbreum
fonte

Respostas:

61

Uma string contém "um número seguido por um xseguido por um número" se e somente se ele contiver um dígito seguido por um xseguido por um dígito, ou seja, se contiver uma substring correspondente ao padrão [0-9]x[0-9]. Então, você está procurando remover os arquivos cujo nome corresponde ao padrão *[0-9]x[0-9]*[0-9]x[0-9]*.jpg.

find /path/to/directory -type f -name '*[0-9]x[0-9]*[0-9]x[0-9]*.jpg' -delete

Se você findnão tiver -delete, ligue rmpara excluir os arquivos.

find /path/to/directory -type f -name '*[0-9]x[0-9]*[0-9]x[0-9]*.jpg' -exec rm {} +
Gilles 'SO- parar de ser mau'
fonte
2
Obrigado! 12.000 arquivos em i 2 seg. Isso me salvou um pouco de trabalho manual!
Mikkelbreum
Nem -deletenem -exec rmtrabalhou para mim em Bash no Windows. Mas isso aconteceu:find /path/to/directory -type f -name '*[0-9]x[0-9]*[0-9]x[0-9]*.jpg' | xargs rm
Tamlyn
2
@Tamlyn Use -print0e xargs -0, caso contrário, o comando falhará com nomes de arquivos que contenham espaços ou aspas simples. Mas -deletee -exec rm fazer o trabalho no Windows. Se algo não funcionar, não é devido ao seu uso.
Gilles 'SO- stop be evil'
Isso também funcionará com o Windows?
CodyBugstein
Funcionará se você tiver uma porta de utilitários Unix, como Cygwin ou GNUWin32. Obviamente, não funcionará imediatamente no Windows. findVerifique se o Windows possui um programa não relacionado chamado , portanto, verifique se os utilitários Unix são os primeiros PATH.
Gilles 'SO- stop be evil'
0

O comando certo é:

find . -type f -iregex '.*[0-9]x[0-9]*\.jpg$'

isso irá pegar apenas arquivos com nomes: 'aaa-12x12.jpg', mas não 'aaa-12x12red.jpg'

MasterR
fonte