Listet Dateien auf, die nicht mit der angegebenen Zeichenfolge im Dateinamen übereinstimmen

15

Ich habe ein Verzeichnis, in dem viele Dateien (ca. 200) mit dem Namen temp_log.$$erstellt werden, zusammen mit mehreren anderen wichtigen Dateien, die ich überprüfen muss.

Wie kann ich einfach alle Dateien auflisten und die temp_log.$$Dateien von der Anzeige ausschließen?

Erwartete Ausgabe

$ ls -lrt <exclude-filename-part>
-- Lists files not matching the above given string

Ich habe die lsManpage durchgesehen , aber in dieser Referenz nichts gefunden. Bitte lassen Sie mich wissen, wenn ich hier wichtige Informationen verpasst habe.

Vielen Dank

mtk
quelle
in BASH ls --hide='temp_log.$$'sollte funktionieren. Sie könnten / sollten dies auch mit Platzhaltern erweitern, je nachdem, welcher Teil des gesamten Begriffs temp_log.$$ist.
Erch

Antworten:

23

Mit GNU ls(die Version unter nicht eingebettetem Linux und Cygwin, die manchmal auch an anderer Stelle zu finden ist) können Sie einige Dateien ausschließen, wenn Sie ein Verzeichnis auflisten.

ls -I 'temp_log.*' -lrt

(Beachten Sie die lange Form von -Iist --ignore='temp_log.*')

Mit zsh können Sie die Shell filtern lassen. Übergeben -dan ls, um das Auflisten des Inhalts übereinstimmender Verzeichnisse zu vermeiden.

setopt extended_glob          # put this in your .zshrc
ls -dltr ^temp_log.*

Mit ksh, bash oder zsh können Sie die ksh-Filtersyntax verwenden. Führen Sie in zsh setopt ksh_globzuerst aus. Führen Sie in der Bash shopt -s extglobzuerst aus.

ls -dltr !(temp_log.*)
Gilles 'SO - hör auf böse zu sein'
quelle
Bitte keine einfachen Anführungszeichen im Beispiel für GNU ls: ls -I 'temp_log. *' -Lrt Sie sind erforderlich, um das Muster an den Befehl zu übergeben und die Shell es nicht erweitern zu lassen.
Shargors
In Ubuntu bash v4.3.48 sollte -Itemp_log.*nach dem-I
Yan King Yin
1
@YanKingYin Nein, es ist in Ordnung, ein Leerzeichen nach dem zu haben -I. Es muss jedoch *so oder so zitiert werden. -I temp_log.*nicht funktioniert , sondern -I 'temp_log.*', -I "temp_log.*", -I temp_log.\*etc. sind in Ordnung.
Gilles 'SO - hör auf böse zu sein'
10

Sie können grepmit der Option verwenden -v.

ls -lrt | grep -v <exclude-filename-part>
andrade
quelle
1
nicht sicher, warum dies abgelehnt wurde, es ist die richtige Antwort.
Tim Kennedy
5
Ein Grep auf ls-Ausgabe ist nicht immer korrekt und wird nicht empfohlen. Es hat Nebenwirkungen. Kann sich nicht an genaue Probleme erinnern. Nebenbemerkung - Abstimmung war nicht von mir;)
MTK
3

Sie können dafür verwenden find:

find . \! -name 'temp_log*'

Dadurch werden nur die Namen gedruckt, die Sie hinzufügen können -ls, um eine ls -lStilausgabe mit Zeitstempel und Berechtigungen zu erstellen, oder um -exec ls {} +sie tatsächlich mit den gewünschten Optionen für Spalten, Sortieren usw. an ls zu übergeben.

Ich schrieb dies unter der Annahme, dass dies nur Dateien in einem Verzeichnis waren. Wenn das Verzeichnis andere Verzeichnisse enthält, möchten Sie diese möglicherweise nicht rekursiv auflisten

find . \! -name 'temp_log*' -maxdepth 1

Und wenn Sie ls verwenden, möchten Sie die Option -d übergeben, um zu verhindern, dass es in den Verzeichnissen aufgeführt wird:-exec ls -d {} +

Random832
quelle
Möchte wahrscheinlich -maxdepth 1auch nicht rekursiv imitieren ls.
JW013
Nett. Benutzer, die ein minimaleres POSIX findohne haben, -maxdepth sollten hier suchen .
Wildcard
2

Ich denke, Sie möchten ein Feature der Shell verwenden, nicht von ls. Ich benutze Bash, also habe ich nach Ihren Wünschen gesucht man bash. Suchen Sie nach "^ EXPANSION" (indem Sie zuerst '/' drücken). Auszug:

ERWEITERUNG

    Die Erweiterung wird in der Befehlszeile ausgeführt, nachdem sie in Wörter aufgeteilt wurde. Es werden sieben Arten von Erweiterungen durchgeführt: Klammererweiterung , Tildeerweiterung , Parameter- und Variablenerweiterung , Befehlssubstitution , arithmetische Erweiterung , Wortteilung und Pfadnamenerweiterung .

   ︙
... <snip> ...
   ︙

Pfadnamenerweiterung

    Nach dem Wort Spaltung, es sei denn , die -f Option festgelegt wurde, bash prüft jedes Wort für die Charaktere *, ?und [. Wenn eines dieser Zeichen angezeigt wird, wird das Wort als Muster angesehen und durch eine alphabetisch sortierte Liste von Dateinamen ersetzt, die mit dem Muster übereinstimmen. …

Ich habe kürzlich begonnen, Dateien basierend auf ihrem Anfangsbuchstaben mit einem Befehl wie dem folgenden auszuschließen:

$ ls ./[^t]*

Dies würde zu allem passen, was nicht mit dem Buchstaben beginnt t. Wenn Sie zwischen den Klammern weitere Zeichen einfügen, schließen Sie auch Dateien aus, die mit diesen Buchstaben beginnen.

Auf der Suche nach einem Link, und ich habe einen guten! Siehe Mustervergleich . Von dort aus würde dies für Ihren Fall funktionieren:

$ ls -lrt ./!(temp_log.*)

Dies setzt voraus , dass die extglobShell-Option mit Hilfe von shoptbuiltin ( shopt -s extglob) aktiviert ist , wie von Gilles angegeben .

Alex Leach
quelle
-1

Mach einfach

ls -ltr `grep -il patterntosearch  *`
user43658
quelle
grepSucht nach einem Muster in einer Datei und nicht nach dem Dateinamen.
Evilsoup
-2

Da die Dateien , die Sie DONT wollen , müssen gedruckt „temp_log.“ im Dateinamen, dann mit grep herausfiltern:

ls -lrt | grep -v "temp_log."

HINWEIS: Der andere Beitrag mit einer ähnlichen Antwort wurde wahrscheinlich abgelehnt, weil der Benutzer keine Anführungszeichen "" um die Zeichenkette eingefügt hat, nach der grep suchen sollte. Ohne die Anführungszeichen funktioniert es nicht wie angekündigt.

user185160
quelle
Ihr 'HINWEIS' ist nicht genau richtig. Es gibt bestimmte Zeichen, die möglicherweise in Anführungszeichen gesetzt werden müssen, aber ich glaube nicht, dass diese bestimmte Zeichenfolge irgendwelche enthält.
smokes2345
bis es einen Benutzer oder eine Gruppe mit dem Namen "temp_log" gibt (der Punkt in Regex würde mit einem Leerzeichen oder etwas Folgendem übereinstimmen temp_log. Dies ist kein guter (allgemeiner) Weg, um lsErgebnisse auszuschließen .
Jeff Schaller
nur mit -F, @ smokes2345; Ein Punkt entspricht einem beliebigen Zeichen in einem regulären Grundausdruck. Siehe: unix.stackexchange.com/q/119905/117549
Jeff Schaller