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?
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?
Antworten:
Einfach:
find . ! -name '*2013*'
Fügen Sie ein hinzu, ! -type d
um auch die Dateien vom Typ Verzeichnis (wie sich .
selbst) auszuschließen oder -type f
um 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, 2013
ob ihnen 2013
etwas 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éphane2013
Datei 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 find
in dem Gebietsschema C arbeiten:
LC_ALL=C find . ! -name '*2013*'
Ksh-Dateinamenmuster sind ausreichend:
# files with 2013
ls -d -- *2013*
# files without 2013
ls -d -- !(*2013*)
Wenn Ihre Shell bash ist, müssen Sie ausführen, shopt -s extglob
bevor 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, ls
ist der Befehl möglicherweise nicht richtig. So speichern Sie sie in einem Array
filenames=( !(*2013*) )
for f in "${filenames[@]}"; do ...; done
Hier "2013" finden Sie alle Dateien im aktuellen Verzeichnis, die keine bestimmte Zeichenfolge enthalten:
find . ! -name "*2013*" -type f
ls
gibt eine Fehlermeldung zurück, wenn das Muster keiner Datei entspricht). Beachten Sie auch, dassksh
die Liste sortiert wird.