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
~
. Diese Dateien sind Sicherungsdateien, die in einigen Texteditoren erstellt wurden.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 , istls -1
(Ziffer eins) und auf vielen Systemen-1
benötigt einspaltig Ausgabe auf dem produzieren Terminal , aber wennls
geleitet wird (wie hiergrep
) oder umgeleitet,-1
nicht benötigt wird, ist es bereits einspaltig .Antworten:
Der Grund, warum dies nicht funktioniert, ist, dass die Tilde in Ihr Home-Verzeichnis erweitert wird und daher
grep
keine wörtliche Tilde angezeigt wird. (Siehe zB Bashs Handbuch zur Tilde-Erweiterung .) Sie müssen es zitieren, um die Erweiterung zu verhindern, dhSelbstverständlich werden dadurch weiterhin alle Ausgabezeilen mit einer Tilde entfernt, auch
ls
wenn 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 verwendenquelle
Die GNU-Implementierung von
ls
(auf den meisten Linux-Systemen vorhanden) hat eine Option dafür:-B
Backups ignorieren:quelle
Wenn Sie Bash verwenden, stellen Sie sicher, dass Folgendes
extglob
aktiviert ist:Dann können Sie verwenden:
-d
um den Inhalt von Verzeichnissen nicht anzuzeigen!(*~)
Alle Dateien außer denen, die mit enden~
Unter zsh können Sie dasselbe mit der
kshglob
Option oder mit eigenen erweiterten Globs tun: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
):Aber die allgemeine Idee ist zu verwenden
ls --ignore-backups
.quelle
Dies sollte helfen:
Grund: Das ~ char wird vor Ausführung des Befehls durch Ihr Home-Verzeichnis ersetzt. Versuchen
und
quelle
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,
-C
weil ich eine schöne Darstellung in sortierten Spalten haben möchte)(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
quelle
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
test
Datei 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.
quelle
Obwohl viele Antworten richtig sind (ich mag die Antwort
@Foon
besonders), würde ich bemerken, dass esls -l
aus 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:
was wörtlich sagt
find
:.
-maxdepth 1
Dort suchen Sie nach Entitäten, die
-type f
-a
~
:! -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.)
)-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
find
Befehl 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.quelle