Suchen Sie nach Dateinamen, die keine angegebene Zeichenfolge enthalten

19

Ich möchte das Gegenteil von:

find . -name "*2013*"

Suchen Sie alle Dateien im aktuellen Verzeichnis, deren Namen nicht die Zeichenfolge "2013" enthalten. Wie kann ich das machen?

user1058398
quelle

Antworten:

27

Einfach:

find . ! -name '*2013*'

Fügen Sie ein hinzu, ! -type dum auch die Dateien vom Typ Verzeichnis (wie sich .selbst) auszuschließen oder -type fum nur reguläre Dateien einzuschließen, mit Ausnahme aller anderen Dateitypen (Verzeichnisse, Fifos, Symlinks, Geräte, Sockets ...).

Beachten Sie jedoch, dass *eine Folge von 0 oder mehr Zeichen übereinstimmt . Auf diese Weise können Dateinamen gemeldet werden, die enthalten, 2013ob ihnen 2013etwas vorangestellt oder gefolgt ist, das im aktuellen Gebietsschema nicht vollständig als gültige Zeichen dekodiert werden kann.

Dies kann vorkommen, wenn Sie sich in einem Gebietsschema befinden, in dem die Zeichen für Dateinamen, die in einer anderen Codierung codiert sind, mit mehr als einem Byte (wie in UTF-8) codiert werden können. In einem UTF-8-Gebietsschema würde beispielsweise eine Stéphane2013Datei gemeldet , wenn diese éim iso8859-15-Zeichensatz (als 0xe9-Byte) codiert wäre.

Am besten stellen Sie sicher, dass die Dateinamen im Zeichensatz des Gebietsschemas verschlüsselt sind. Wenn Sie dies jedoch nicht garantieren können, müssen Sie findin dem Gebietsschema C arbeiten:

LC_ALL=C find . ! -name '*2013*'
Stéphane Chazelas
quelle
4

Ksh-Dateinamenmuster sind ausreichend:

# files with 2013
ls -d -- *2013*

# files without 2013
ls -d -- !(*2013*)

Referenz

Wenn Ihre Shell bash ist, müssen Sie ausführen, shopt -s extglobbevor Sie dieses Muster verwenden können (Sie können es in Ihr einfügen .bashrc). Wenn Ihre Shell zsh ist, müssen Sie ausführen setopt ksh_glob(Sie können es in Ihre einfügen .zshrc). Zsh bietet auch ls -d -- ^*2013*, was eine vorläufige erfordert setopt extended_glob.

Je nachdem, was Sie mit diesen Dateinamen machen, lsist der Befehl möglicherweise nicht richtig. So speichern Sie sie in einem Array

filenames=( !(*2013*) )
for f in "${filenames[@]}"; do ...; done
Glenn Jackman
quelle
4
Dies ist in Unterverzeichnissen nicht der Fall und überspringt dennoch Punktdateien (und lsgibt eine Fehlermeldung zurück, wenn das Muster keiner Datei entspricht). Beachten Sie auch, dass kshdie Liste sortiert wird.
Stéphane Chazelas
-1

Hier "2013" finden Sie alle Dateien im aktuellen Verzeichnis, die keine bestimmte Zeichenfolge enthalten:

find . ! -name "*2013*" -type f
user7194913
quelle
2
Dies ist im Wesentlichen dasselbe wie unix.stackexchange.com/a/102614/117549 von vor 3 Jahren, außer dass Sie "-f" hinzugefügt haben, was dies zu einer schlechteren Antwort macht.
Jeff Schaller