![Löschen Sie alle Dateien außer Dateien mit der Erweiterung pdf in einem Verzeichnis](https://rvso.com/image/977075/L%C3%B6schen%20Sie%20alle%20Dateien%20au%C3%9Fer%20Dateien%20mit%20der%20Erweiterung%20pdf%20in%20einem%20Verzeichnis.png)
Ich habe ein Verzeichnis, das Folgendes enthält:
x.pdf
y.zip
z.mp3
a.pdf
Ich möchte alle Dateien außer x.pdf
und löschen a.pdf
. Wie mache ich das vom Terminal aus? Es gibt keine Unterverzeichnisse, daher ist keine Rekursion erforderlich.
Antwort1
cd <the directory you want>
find . -type f ! -iname "*.pdf" -delete
- Der erste Befehl führt Sie in das Verzeichnis, in dem Sie Ihre Dateien löschen möchten
- Der zweite Befehl löscht alle Dateien außer denen mit der Endung
.pdf
im Dateinamen.
temp
Wenn sich in Ihrem Home-Ordner beispielsweise ein Verzeichnis mit dem Namen befindet :
cd ~/temp
dann Dateien löschen:
find . -type f ! -iname "*.pdf" -delete
Dadurch werden alle Dateien außer gelöscht xyz.pdf
.
Sie können diese beiden Befehle kombinieren, um:
find ~/temp -type f ! -iname "*.pdf" -delete
.
ist das aktuelle Verzeichnis. !
bedeutet, alle Dateien außer denen mit .pdf
am Ende zu nehmen. -type f
wählt nur Dateien aus, keine Verzeichnisse. -delete
bedeutet, sie zu löschen.
HINWEIS: Dieser Befehl löscht alle Dateien (außer PDF-Dateien, aber auch versteckte Dateien) im aktuellen Verzeichnis sowie in allen Unterverzeichnissen. !
muss vor stehen -name
. simply -name
schließt nur ein .pdf
, während sowohl als -iname
auch einschließt.pdf
.PDF
Um nur im aktuellen Verzeichnis und nicht in Unterverzeichnissen zu löschen, fügen Sie hinzu -maxdepth 1
:
find . -maxdepth 1 -type f ! -iname "*.pdf" -delete
Antwort2
Mit bash
dem erweiterten Shell-Globbing können Sie alle Dateien mit anderen Erweiterungen .pdf
als
rm -- *.!(pdf)
Wie von @pts angemerkt, --
zeigen die Zeichen das Ende aller Befehlsoptionen an und machen den Befehl im seltenen Fall von Dateien sicher, deren Namen mit einem -
Zeichen beginnen.
Wenn Sie Dateien ohne Erweiterung sowie solche mit anderen Erweiterungen als löschen möchten .pdf
, können Sie, wie von @DennisWilliamson angemerkt, Folgendes verwenden:
rm -- !(*.pdf)
Erweitertes Globbing sollte standardmäßig aktiviert sein. Wenn nicht, können Sie dies tun mit
shopt -s extglob
Insbesondere wenn Sie dies in einem Skript verwenden möchten, ist es wichtig zu beachten, dass, wenn der Ausdruck mit nichts übereinstimmt (d. h. wenn sich keine Nicht-PDF-Dateien im Verzeichnis befinden), der Glob standardmäßig unerweitert an den rm
Befehl übergeben wird, was zu einem Fehler wie diesem führt.
rm: cannot remove `*.!(pdf)': No such file or directory
Sie können dieses Standardverhalten mit der nullglob
Shell-Option ändern, dies bringt jedoch ein eigenes Problem mit sich. Eine ausführlichere Erläuterung finden Sie unterNullGlob – Gregs Wiki
Antwort3
$ cd <the directory you want>
$ gvfs-trash !(*.pdf)
Oder per mv
Befehl (aber auf diese Weise können Sie es nicht aus dem Papierkorb wiederherstellen, da es keine .trashinfo-Informationen aufzeichnet. Dies bedeutet, dass Sie Ihre Dateien in einenZieldort steht es wie folgt).
mv !(*.pdf) ~/.local/share/Trash/files
Antwort4
Verwenden Sie GLOBIGNORE von Bash:
GLOBIGNORE=x.pdf:a.pdf
rm *
unset GLOBIGNORE
Von der Manpage von Bash:
GLOBIGNORE: Eine durch Doppelpunkte getrennte Liste von Mustern, die den Satz definieren von Dateinamen, die bei der Pfadnamenerweiterung ignoriert werden sollen.
Ein kurzer Test:
mkdir /tmp/foooooo
cd /tmp/foooooo
touch x.pdf y.zip z.mp3 a.pdf
GLOBIGNORE=x.pdf:a.pdf
ls -1 *
Ausgabe:
y.zip z.mp3