Vermeiden Sie die Auflistung von Dateien, die mit ~ enden (Sicherungsdateien)

20

Meine Anforderung ist, alle Dateien in einem Verzeichnis aufzulisten, mit Ausnahme der Dateien, die mit einem ~(Sicherungsdateien) enden .

Ich habe versucht, Befehl zu verwenden:

ls -l | grep -v ~    

Ich bekomme diese Ausgabe:

asdasad
asdasad~
file_names.txt
normaltest.txt
target_filename
testshell1.sh
testshell1.sh~
testshell2.sh
testshell2.sh~
testtwo.txt
testtwo.txt~
test.txt
test.txt~

Ich möchte nur diese Dateien erhalten:

asdasad
file_names.txt
normaltest.txt
target_filename
testshell1.sh
testshell2.sh
testtwo.txt
test.txt
neugierig
quelle
Es sieht so aus, als würden Sie vermeiden, Dateien aufzulisten, die mit einem enden ~. Diese Dateien sind Sicherungsdateien, die in einigen Texteditoren erstellt wurden.
Strg-Alt-Delor
Welches Betriebssystem verwenden Sie: Ist es ein Gnu / Linux (wie Debian, Ubuntu, RedHat, Centos, Fedora, Suse, Mint, Arch, ...)?
Strg-Alt-Delor
2
Beachten Sie, dass es sich bei der zu ignorierenden Datei anscheinend um Emacs-Sicherungsdateien handelt. Es ist ziemlich einfach, das Verhalten von Emacs so zu ändern, dass Backups in einem zentralen Verzeichnis und nicht überall gespeichert werden. Siehe emacs.stackexchange.com/questions/33/…
Kilian Foth
Es tut mir leid, gemein zu sein, aber ich glaube dir nicht. ls -l(Buchstabe ell) würde die Berechtigungen, nlinks, Besitzer, Größe und Modtime für jede aufgeführte Datei enthalten. Was wäre das Ergebnis die Ausgabe , die Sie zeigen , ist ls -1(Ziffer eins) und auf vielen Systemen -1benötigt einspaltig Ausgabe auf dem produzieren Terminal , aber wenn lsgeleitet wird (wie hier grep) oder umgeleitet, -1nicht benötigt wird, ist es bereits einspaltig .
Dave_thompson_085
@ Dave_Thompson_085 Ich habe den gesamten Text abgeschnitten und nur die Dateinamen hier. Weil ich das irrelevant fand. Und auch das ist ein Produktionssystem (nicht mein eigenes System). Also möchte ich keine Benutzernamen, Details und Leckagen auflisten.
curious_one

Antworten:

49
ls -l | grep -v ~

Der Grund, warum dies nicht funktioniert, ist, dass die Tilde in Ihr Home-Verzeichnis erweitert wird und daher grepkeine wörtliche Tilde angezeigt wird. (Siehe zB Bashs Handbuch zur Tilde-Erweiterung .) Sie müssen es zitieren, um die Erweiterung zu verhindern, dh

ls -l | grep -v "~"

Selbstverständlich werden dadurch weiterhin alle Ausgabezeilen mit einer Tilde entfernt, auch lswenn sie sich in der Mitte eines Dateinamens oder an einer anderen Stelle in der Ausgabe befinden (obwohl dies wahrscheinlich nicht in Benutzernamen, Datumsangaben oder Ähnlichem vorkommt). Wenn Sie wirklich nur Dateien ignorieren möchten, die mit einer Tilde enden, können Sie verwenden

ls -l | grep -v "~$"
ilkkachu
quelle
48

Die GNU-Implementierung von ls(auf den meisten Linux-Systemen vorhanden) hat eine Option dafür: -BBackups ignorieren:

ls --ignore-backups
hschou
quelle
24

Wenn Sie Bash verwenden, stellen Sie sicher, dass Folgendes extglobaktiviert ist:

shopt -s extglob

Dann können Sie verwenden:

ls -d -- !(*~)
  • -d um den Inhalt von Verzeichnissen nicht anzuzeigen
  • !(*~) Alle Dateien außer denen, die mit enden ~

Unter zsh können Sie dasselbe mit der kshglobOption oder mit eigenen erweiterten Globs tun:

setopt extended_glob
ls -d -- ^*~

Da das auszuschließende Suffix nur ein Zeichen lang ist, können Sie auch nach Dateinamen suchen, bei denen das letzte Zeichen nicht die Tilde ist (dies sollte auch ohne funktionieren extglob):

ls -d -- *[^~]

Aber die allgemeine Idee ist zu verwenden ls --ignore-backups.

Ravexina
quelle
12

Dies sollte helfen:

ls -l | grep -v '~'  

Grund: Das ~ char wird vor Ausführung des Befehls durch Ihr Home-Verzeichnis ersetzt. Versuchen

echo ~

und

echo '~'
Nico Mittenzwey
quelle
6

Wie in anderen Antworten erwähnt, liegt der Grund, warum Sie wahrscheinlich Probleme haben, darin, dass Sie die Tilde nicht zitiert haben oder ihr nicht entkommen sind.

Für einen bestimmten Anwendungsfall habe ich die Dateinamenerweiterung der Shell verwendet, um etwas Ähnliches zu tun. Ich benutze es seit ungefähr 2003, was bedeutet, dass es auf einer Vielzahl von Shell-Implementierungen auf verschiedenen Arten von Systemen funktioniert hat. (hier nutze ich auch, -Cweil ich eine schöne Darstellung in sortierten Spalten haben möchte)

ls -C *[!~]

(Eine Einschränkung bei der Verwendung der Dateinamenerweiterung in der Shell ist natürlich, dass ein Verzeichnis mit einer sehr großen Anzahl von (nicht gesicherten) Dateien dazu führt, dass die Erweiterung die verfügbare Argumentlistengröße überschreitet. Auf den meisten modernen Systemen ist diese Beschränkung jedoch häufig recht hoch 250 KB oder mehr, manchmal viel mehr

Greg A. Woods
quelle
1

ls | grep -v '~$'ist die schnelle Lösung. Mit ls werden alle (nicht ausgeblendeten) Dateien aufgelistet, und mit grep with -v(invertierter Abgleich, dh Ausschluss) werden alle Zeilen mit der Tilde ( ~) am Ende ( $) ausgeschlossen.

Wenn Sie jedoch Dateien mit dem Namen "something1" oder "something2" haben, ist dies ein GROSSER Hinweis darauf, dass Sie einen fehlerhaften Workflow haben, den Sie an der Quelle beheben sollten.

Wenn Sie feststellen, dass Sie Dateien mit Versionsnummern wie test1 und test2 oder testone und testtwo benennen, möchten Sie wirklich ein Versionskontrollsystem wie git.

Dies gilt insbesondere für den Fall, dass Sie mehrere Versionen mehrerer Dateien haben und die Versionsverwaltung zwischen allen Dateien koordiniert werden muss.

Mit Versionskontrollsystemen können Sie im Wesentlichen ein Zeitfenster auf das Dateisystem legen, sodass Sie nur eine testDatei sehen. Unter der Haube (über das Versionskontrollprogramm) stehen jedoch alle Versionen zum Durchsuchen, Abrufen, Wiederherstellen, Vergleichen usw. Zur Verfügung .

Sobald Sie dies eingerichtet haben, benötigen Sie keine Sicherungsdateien mehr von Ihrem Editor, da die Versionskontrolle den Verlauf der Dateien seit Beginn der Verwendung enthält, auch wenn Sie seitdem tausend Änderungen vorgenommen haben. Sie können sogar die Verlaufszeitleiste "verzweigen", eine neue Idee ausprobieren und die Zeit zurückverfolgen und dann eine andere Idee ausprobieren, wenn dies erforderlich ist.

Bitte lösche mich
quelle
1

Obwohl viele Antworten richtig sind (ich mag die Antwort @Foonbesonders), würde ich bemerken, dass es ls -laus verschiedenen Gründen etwas lahm ist , die Liste der Namen mit zu bekommen .

Es ist nicht überraschend, dass das richtige Tool zum Auffinden von Dateien ist find.

Eine seiner Schlussfolgerungen ist, dass es in der Lage ist, die "Auswahllogik" selbst zu handhaben, zum Beispiel:

$ find . -maxdepth 1 \( -type f -a \! -name '*~' \) -print

was wörtlich sagt find:

  1. Suchen Sie nach Dateien im aktuellen Verzeichnis: .
  2. Suchen Sie sie nur auf der Ebene dieses Verzeichnisses - das heißt, nicht rekursiv: -maxdepth 1
  3. Dort suchen Sie nach Entitäten, die

    • vom Typ Datei: -type f
    • und: -a
    • deren Namen enden nicht mit ~: ! -name *~ (wobei die !folgende Anweisung negiert, die mit den Dateinamen übereinstimmt -name *~).

    (Damit die gesamte Übereinstimmung von Typ und Name als logische Einheit angezeigt wird, steht sie in Klammern mit (und. ))

  4. Drucken Sie den Namen jeder Datei gefunden: -print.

Sie müssen einige Zeichen, die für die Shell spezifisch sind !, davor schützen, von der Shell interpretiert zu werden. Aus diesem Grund werden die Klammern und der Knall mit einem Backslash versehen und das Namensmuster *~wird in einfache Anführungszeichen gesetzt.

Der findBefehl besitzt durch die Verwendung seiner Optionen eine sehr mächtige Minisprache. Beispielsweise kann es erforderlich sein, einen ganzen Dateisystembaum (oder mehrere Bäume) rekursiv zu verarbeiten, bestimmte Verzeichnisse jedoch beim Scannen wegzulassen. Es ist möglich, mehrere Attribute der Dateien zuzuordnen, z. B. die Erstellungs- oder Änderungszeit oder die Größe einer beliebigen Datei.

kostix
quelle