Löschen Sie Dateien in einem Verzeichnis, deren Dateiname einen Bindestrich enthält

Löschen Sie Dateien in einem Verzeichnis, deren Dateiname einen Bindestrich enthält

Auf meinem macOS-System habe ich einen Ordner mit über 7.000 Bildern und muss die Bilder löschen, deren Dateiname einen Bindestrich enthält. Ich habe die folgenden Befehle ausprobiert, ohne eine Antwort zu erhalten, nachdem ich cdin das Verzeichnis gegangen bin (ich bin neu im Terminal):

rm -rf -- -
$ rm ./-
find . -type f -regex '/-/' -exec rm {} \;
find . -name '-*' | xargs rm
find . -regex '/-/' -print0 | xargs -0 rm

Antwort1

Das Muster *-*stimmt mit jedem Namen im aktuellen Verzeichnis überein, derenthält einen Bindestrich(wörtlich „ein Name, der mindestens ein enthält -, möglicherweise mit einem Präfix und/oder Suffix einer anderen Zeichenfolge“). Das bedeutet, dass Sie Folgendes tun können sollten:

rm ./*-*

oder

rm -- *-*

um alle Dateien -im aktuellen Verzeichnis zu löschen, deren Namen ein bestimmtes Zeichen enthalten.

In der zshShell *-*(.)würde die Verwendung als Muster die Übereinstimmung auf ausschließlich normale Dateien beschränken (keine Verzeichnisse, obwohl rmVerzeichnisse ohnehin nicht gelöscht werden könnten).

Wenn das zu viele Dateien sind, um sie rmauf einmal zu verarbeiten, gehen Sie findfolgendermaßen vor:

find . -maxdepth 1 -type f -name '*-*' -delete

Ich verwende es, -maxdepth 1um die Suche auf das aktuelle Verzeichnis zu beschränken, und habe hinzugefügt, -type fdass nur normale Dateien gelöscht werden.

Sie könnten auch eine (etwas langsame) Schleife verwenden:

for name in ./*-*; do
    rm "$name"
done

Manche Leute bevorzugen "Einzeiler", und diese Schleife könnte wie folgt geschrieben werden

for name in ./*-*; do rm "$name"; done

... obwohl es in den meisten modernen Shells durchaus möglich wäre, es als mehrzeiligen Befehl einzugeben.

verwandte Informationen