supprimer les fichiers correspondant au modèle

32

J'ai besoin de supprimer récursivement tous les fichiers dans tous les sous-répertoires où le nom de fichier contient un nombre suivi d'un «x» suivi d'un nombre, au moins deux fois.

Exemple:

Je voudrais supprimer ces fichiers:

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

Mais je ne veux PAS supprimer ces fichiers:

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

Comment puis-je faire cela (à partir du shell bash)

mikkelbreum
la source

Réponses:

61

Une chaîne contient «un nombre suivi d'un xsuivi d'un nombre» si et seulement si elle contient un chiffre suivi d'un xsuivi d'un chiffre, c'est-à-dire si elle contient une sous-chaîne correspondant au motif [0-9]x[0-9]. Vous cherchez donc à supprimer les fichiers dont le nom correspond au modèle *[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

Si ce findn'est pas le cas -delete, appelez rmpour supprimer les fichiers.

find /path/to/directory -type f -name '*[0-9]x[0-9]*[0-9]x[0-9]*.jpg' -exec rm {} +
Gilles, arrête de faire le mal
la source
2
Merci! 12.000 fichiers disparus en 2 sec. Cela m'a sauvé du travail manuel!
mikkelbreum
Ni -deleteni -exec rmtravaillé pour moi dans Bash sur Windows. Mais cela a fait:find /path/to/directory -type f -name '*[0-9]x[0-9]*[0-9]x[0-9]*.jpg' | xargs rm
Tamlyn
2
@Tamlyn Utilisez -print0et xargs -0sinon la commande échouera avec des noms de fichiers contenant des espaces ou des guillemets simples. Mais -deleteet -exec rm faire le travail sur Windows. Si quelque chose ne fonctionne pas, ce n'est pas dû à leur utilisation.
Gilles 'SO- arrête d'être méchant'
Cela fonctionnera-t-il également avec Windows?
CodyBugstein
Cela fonctionnera si vous disposez d'un port d'utilitaires Unix tels que Cygwin ou GNUWin32. Évidemment, cela ne fonctionnera pas prêt à l'emploi sous Windows. Veillez à ce que Windows ait un programme indépendant appelé find, assurez-vous donc que les utilitaires Unix sont les premiers PATH.
Gilles 'SO- arrête d'être méchant'
0

La bonne commande est:

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

cela ne récupérera que les fichiers avec des noms: 'aaa-12x12.jpg', mais pas 'aaa-12x12red.jpg'

MasterR
la source