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)

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 {} +

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'

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.