Löschen Sie alle Dateien außer Dateien mit der Erweiterung pdf in einem Verzeichnis

Löschen Sie alle Dateien außer Dateien mit der Erweiterung pdf in einem Verzeichnis

Ich habe ein Verzeichnis, das Folgendes enthält:

x.pdf
y.zip
z.mp3
a.pdf

Ich möchte alle Dateien außer x.pdfund 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 .pdfim Dateinamen.

tempWenn 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 .pdfam Ende zu nehmen. -type fwählt nur Dateien aus, keine Verzeichnisse. -deletebedeutet, 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 -nameschließt nur ein .pdf, während sowohl als -inameauch 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 bashdem erweiterten Shell-Globbing können Sie alle Dateien mit anderen Erweiterungen .pdfals

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 rmBefehl ü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 nullglobShell-Option ändern, dies bringt jedoch ein eigenes Problem mit sich. Eine ausführlichere Erläuterung finden Sie unterNullGlob – Gregs Wiki

Antwort3

In den Papierkorb löschen:

$ cd <the directory you want>
$ gvfs-trash !(*.pdf)

Oder per mvBefehl (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

verwandte Informationen