Die Flagge wird in der ls
Manpage so beschrieben (Hervorhebung liegt bei mir) ...
Listen Sie keine impliziten Einträge auf, die mit dem Shell-MUSTER übereinstimmen
Die Manpage hat nicht viel über "impliziert" zu sagen. Was zum Teufel bedeutet das? Ein impliziter Eintrag (Datei, Verzeichnis usw.) ist ein Eintrag, der zurückgegeben ls
wird, ohne dass Sie explizit ein Argument angegeben haben, das diesem Eintrag entspricht. Eine Übereinstimmung kann entweder der tatsächliche Name des Eintrags sein ( ls books_tom.csv ...
anhand Ihres Beispiels) oder ein Glob, der mit ihm übereinstimmt ( ls *tom.csv
z. B.).
Wenn Sie ls
ohne Argumente aufrufen , ist alles, was zurückgegeben wird, impliziert! Ich gehe davon aus, dass die häufigste Verwendung von --ignore
einem solchen ansonsten schmucklosen ls
Aufruf ist, da dies der einfachste Weg ist, eine Operation "Alles außer X auflisten" durchzuführen ... zumindest, wenn Sie die Verwendung anderer Befehle vermeiden möchten.
Schauen wir uns also Ihren Befehl an. Bei ls *.csv --ignore="*tom*"
"books_tom.csv" wird explizit über das passende Muster verwiesen *.csv
. Mit ls --ignore="*tom*"
, gemäß dem vorherigen Absatz, ist alles im Verzeichnis impliziert, so dass "books_tom.csv" nicht angezeigt wird.
Wenn in Ihrer Shell erweitertes Globbing verfügbar ist (mit Bash, das Sie aktivieren können shopt -s extglob
), können Sie das erreichen, was Sie möchten, indem Sie ein Muster erstellen, das "Tom" ausschließt. Zum Beispiel ls books_!(tom).csv
würde sich books_abby.csv
aber nicht zeigen books_tom.csv
.
(Natürlich können Sie auch andere Tools wie find
Pipe to grep -v
usw. verwenden. Ich gebe nur eine reine ls
Lösung.)
grep
?ls books_!(tom).csv
Lösung und es funktioniert :) Mein tatsächlicher Anwendungsfall hat Daten in den Dateinamen (zB2017_10_29
) und ich versuche , ohne das Datum eine Liste aller Dateien zu erhalten verwendenls *_!(2017_10_29).csv
undls *_!("2017_10_29").csv
aber es gibt immer noch Dateien von diesem Zeitpunkt an einer Idee Warum?books_2017_
das mit*_
und10_29.csv
übereinstimmt!(2017_10_29).csv
. Wenn Sie das verwendenbooks_!(2017_10_29).csv
, würde das funktionieren. Es ist besser, wenn Sie explizitere Muster verwenden, da dies*
sehr flexibel ist.find
(z. B.find . -name '*csv' -not -name '*2017_10_29*'
) verwenden sollten oder, vorausgesetzt Ihre Dateinamen haben kein Leerzeichen oder andere seltsame Zeichen, nurls *csv | grep -v 2017_10_29
.