Löschen Sie Dateien, die dem Muster entsprechen

32

Ich muss rekursiv alle Dateien in allen Unterverzeichnissen entfernen, in denen der Dateiname mindestens zweimal eine Zahl gefolgt von einem 'x' gefolgt von einer Zahl enthält.

Beispiel:

Ich möchte diese Dateien entfernen:

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

Aber ich möchte diese Dateien NICHT entfernen:

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

Wie kann ich das machen (aus der Bash Shell)

mikkelbreum
quelle

Antworten:

61

Eine Zeichenfolge enthält "eine Zahl gefolgt von einer xZahl", wenn und nur wenn sie eine Ziffer gefolgt von einer xZiffer enthält, dh wenn sie eine Teilzeichenfolge enthält, die mit dem Muster übereinstimmt [0-9]x[0-9]. Sie möchten also die Dateien entfernen, deren Name mit dem Muster übereinstimmt *[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

Wenn finddies nicht der Fall ist -delete, rufen Sie rman, um die Dateien zu löschen.

find /path/to/directory -type f -name '*[0-9]x[0-9]*[0-9]x[0-9]*.jpg' -exec rm {} +
Gilles 'SO - hör auf böse zu sein'
quelle
2
Vielen Dank! 12.000 Dateien in 2 Sek. Das ersparte mir Handarbeit!
Mikkelbreum
Weder -deletenoch -exec rmfür mich in Bash unter Windows gearbeitet. Aber das tat:find /path/to/directory -type f -name '*[0-9]x[0-9]*[0-9]x[0-9]*.jpg' | xargs rm
Tamlyn
2
@Tamlyn Verwenden Sie -print0und xargs -0, andernfalls schlägt der Befehl mit Dateinamen fehl, die Leerzeichen oder einfache Anführungszeichen enthalten. Aber -deleteund -exec rm tut Arbeit unter Windows. Wenn etwas nicht funktioniert, liegt es nicht an ihrer Verwendung.
Gilles 'SO - hör auf böse zu sein'
Funktioniert das auch mit Windows?
CodyBugstein
Es funktioniert, wenn Sie einen Port mit Unix-Dienstprogrammen wie Cygwin oder GNUWin32 haben. Offensichtlich funktioniert es nicht sofort unter Windows. Stellen Sie findsicher, dass Windows über ein nicht verwandtes Programm verfügt , stellen Sie also sicher, dass die Unix-Dienstprogramme an erster Stelle stehen PATH.
Gilles 'SO - hör auf, böse zu sein'
0

Der richtige Befehl lautet:

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

Dies wird nur Dateien mit Namen erfassen: 'aaa-12x12.jpg', aber nicht 'aaa-12x12red.jpg'

MasterR
quelle