cd <the directory you want>
find . -type f ! -iname "*.pdf" -delete
- Mit dem ersten Befehl gelangen Sie in das Verzeichnis, in dem Sie Ihre Dateien löschen möchten
- Der zweite Befehl löscht alle Dateien mit Ausnahme der Dateien, die mit
.pdf
Dateiname enden
Wenn sich beispielsweise ein Verzeichnis temp
in Ihrem privaten Ordner befindet, gehen Sie wie folgt vor :
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, dass alle Dateien außer denen mit .pdf
am Ende genommen werden. -type f
Wählt nur Dateien aus, keine Verzeichnisse. -delete
bedeutet, es zu löschen.
HINWEIS: Mit diesem Befehl werden alle Dateien (außer PDF-Dateien, aber auch versteckte Dateien) im aktuellen Verzeichnis sowie in allen Unterverzeichnissen gelöscht. !
muss vorher kommen -name
. wird einfach -name
nur einschließen .pdf
, während -iname
beide .pdf
und einschließen.PDF
Um nur im aktuellen Verzeichnis und nicht in den Unterverzeichnissen zu löschen, fügen Sie Folgendes hinzu -maxdepth 1
:
find . -maxdepth 1 -type f ! -iname "*.pdf" -delete
.
bedeutet "und"?!
bedeutet "Ausgenommen"-name
bedeutet, dass Sie durch einen Namensparameter ausschließen möchten, und ist dann-delete
die Aktion, die beim Auffinden durchzuführen ist? Also sucht es nach allem außer "* .pdf" und löscht sie? Oder habe ich falsch verstanden?.
bedeutet aktuelles Verzeichnis.!
bedeutet, alle Dateien mit Ausnahme der.pdf
am Ende.-delete
bedeutet, es zu löschen. bin ich jetzt klar-maxdepth 1
Parameter enthalten haben, um mit zu beginnen. Dann schlagen Sie vor, den Parameter zu entfernen, falls rekursiv gelöscht werden soll.-iname
anstelle von verwenden sollten-name
, oder Dateien mit.PDF
einer Erweiterung werden durchrutschen.Mit
bash
der erweiterten Shell-Globbing-Funktion können Sie alle Dateien mit anderen als den.pdf
verwendeten Erweiterungen entfernenWie von @pts angegeben, geben die
--
Zeichen das Ende aller Befehlsoptionen an. Stellen Sie den Befehl in seltenen Fällen sicher, wenn die Namen der Dateien mit einem-
Zeichen beginnen.Wenn Sie Dateien ohne oder mit einer anderen Erweiterung löschen möchten, können Sie
.pdf
, wie von @DennisWilliamson ausgeführt, diese verwendenErweitertes Globbing sollte standardmäßig aktiviert sein. Wenn dies nicht der Fall ist, können Sie dies mit tun
Insbesondere wenn Sie dies in einem Skript verwenden möchten, ist es wichtig zu beachten, dass der Glob standardmäßig nicht erweitert an den übergeben wird, wenn der Ausdruck mit nichts übereinstimmt (dh wenn sich keine Nicht-PDF-Dateien im Verzeichnis befinden)
rm
Befehl, was zu einem Fehler wieSie können dieses Standardverhalten mit der
nullglob
Shell-Option ändern, dies hat jedoch ein eigenes Problem. Eine ausführlichere Diskussion finden Sie in NullGlob - Gregs Wikiquelle
rm *~*.pdf
!(*.py)
. Wenn das OP nur ".pdf" -Dateien übrig haben möchte, sollten vermutlich auch Dateien ohne Erweiterungen gelöscht und nicht ignoriert werden.In den Papierkorb löschen :
Oder über
mv
Befehl (aber auf diese Weise können Sie es nicht aus dem Papierkorb wiederherstellen , da es nicht .trashinfo Informationen aufzeichnen, so dass diese Mittel Sie Ihre Dateien auf ein bewegtes Ziel , wo es ist , wie folgend).quelle
rm
.Der einfachste Ansatz: Erstellen Sie irgendwo ein anderes Verzeichnis (wenn Sie nur in einem Verzeichnis löschen, nicht rekursiv, kann es sogar ein Unterverzeichnis sein); Bewegen Sie alle PDFs dorthin. alles andere löschen; Schiebe die PDF's zurück; Zwischenverzeichnis löschen.
Schnell und einfach können Sie genau sehen, was Sie tun. Stellen Sie einfach sicher, dass sich das Zwischenverzeichnis auf demselben Gerät befindet wie das Verzeichnis, das Sie bereinigen, damit Verschiebungen Umbenennungen und keine Kopien sind!
quelle
Verwende bashs GLOBIGNORE:
Aus der Manpage von bash:
Ein kurzer Test:
Ausgabe:
quelle
Sei vorsichtig und komponiere: benutze Xargs
Hier ist ein Ansatz, den ich mag, da ich sehr vorsichtig sein kann: Erstelle einen Weg, um nur die Dateien anzuzeigen, die ich löschen möchte, und sende sie dann an
rm
usingxargs
. Zum Beispiel:ls
zeigt mir allesls | grep pdf
Zeigt mir die Dateien, die ich behalten möchte. Hmm.ls | grep -v pdf
zeigt das gegenteil: alles ausser was ich behalten will. Mit anderen Worten, es wird die Liste der Dinge angezeigt, die ich löschen möchte. Ich kann das bestätigen, bevor ich etwas Gefährliches tue.ls | grep -v pdf | xargs rm
sendet genau diese Liste zumrm
Löschen anWie gesagt, ich mag dies hauptsächlich aus Sicherheitsgründen: kein Zufall
rm *
für mich. Zwei weitere Vorteile:ls
oder verwendenfind
, um die anfängliche Liste zu erhalten. Sie können alles verwenden, was Sie möchten, um diese Liste einzugrenzen - eine anderegrep
, eine andereawk
oder was auch immer. Wenn Sie nur Dateien löschen müssen, deren Namen eine Farbe enthalten, können Sie diese auf dieselbe Weise aufbauen.find
finden undrm
zu entfernen, anstatt mich daran erinnern zu müssen, dassfind
eine-delete
Flagge akzeptiert wird . Und wenn Sie dies erneut tun, können Sie alternative Lösungen erstellen. Vielleicht können Sie stattdessenrm
einentrash
Befehl erstellen , der die Datei in den Papierkorb verschiebt (undeletion zulässt) und stattdessen an diesen weiterleitetrm
. Sie brauchen keinefind
Unterstützung für diese Option, Sie leiten einfach zu ihr.Aktualisieren
In den Kommentaren von @pabouk finden Sie Informationen dazu, wie Sie dies ändern können, um einige Randfälle wie Zeilenumbrüche in Dateinamen, Dateinamen
my_pdfs.zip
usw. zu behandeln.quelle
pdf
irgendwo in ihrem Namen enthalten sind. --- b) Es werden PDF-Dateien gelöscht, wenn einer der Buchstaben im Suffix in Großbuchstaben geschrieben ist. --- c) Es ist keine gute Idee, die Ausgabe von zu verwendenls
. Es funktioniert nicht mit Dateinamen, die Zeilenumbrüche enthalten. Einige Implementierungen zumls
Ersetzen von Sonderzeichen, z?
. B. tab durch . --- Es ist besser zu nutzen:find -maxdepth 1 -print0
. (nicht so kurz wiels
:) ----- Um a) und b) zu lösen, verwenden Siegrep -vi '\.pdf$'
--- vollständige (aber nur GNU) Lösung:find -maxdepth 1 -print0 | grep -viz '\.pdf$' | xargs -0 rm
| head -20
zumindest überprüfen, ob sie ungefähr korrekt aussehen, und wenn Sie dies nurrm my_pattern
tun, haben Sie keine Chance, einen großen Fehler zu entdecken.find . -type f ! -name "*.pdf"
, um auf die Konsole zu drucken oder auf less oder eine Datei umzuleiten . [und dann wie in Pabouks Kommentaren (mit -print0 | ... -0 für seltsame Dateinamen) an xargs rm weiterleiten]Normalerweise löse ich solche Probleme mit dem interaktiven Python-Interpreter:
Es mag länger sein als ein Einzeiler mit
find
oderxargs
, aber es ist extrem belastbar, und ich weiß genau, was es tut, ohne es zuerst erforschen zu müssen.quelle
for item in [f for f in os.listdir('.') if not f.endswith('.pdf')]: os.remove(item)
python -c "import os; for f in os.listdir('.'): if not f.endswith('.pdf'): os.remove(f)"
[os.remove(f) for f in os.listdir('.') if not f.endswith('.pdf')]
Eine bessere Antwort (im Vergleich zu meiner vorherigen Antwort) auf diese Frage ist die Verwendung des leistungsstarken
file
Befehls.jetzt dein problem:
Die Aufgabe des
for
Befehls ist es, die Dateien im aktuellen Verzeichnis in Form von Variablen anzugeben$var
.if-then
Befehl gibt die Namen von PDF-Dateien aus, indem er den Exit-Status0
vonfile -i "$var" | grep -q 'application/pdf\;'
Befehl annimmt. Er gibt den Exit-Status von0
nur dann an, wenn er PDF-Dateien findet.quelle
Warnung! Versuchen Sie es lieber zuerst
quelle
-i
mitgrep
für Groß- und Kleinschreibung Matching.Lesen Sie als, entfernen Sie alle Dateien, die nicht
a.pdf
oder sindx.pdf
.Dies funktioniert durch die Verwendung von 2 erweitert Klackse machen, die äußere
!()
die enthaltenen glob negieren , die selbst erfordert , dass die glob eine oder mehrere übereinstimmen müssena
oderx
Muster vor dem.pdf
Suffix. Siehe glob # extglob .quelle
tragbare Schale Weg
Ziemlich viel POSIX und kompatibel mit jedem Bourne-style - Shell (
ksh
,bash
,dash
). Gut geeignet für portable Skripte und wenn Sie dasbash
Extended Shell Globbing nicht verwenden können .perl:
Oder etwas sauberer:
alternative Python
quelle
Pass auf, was du löschst!
Ein sicherer Weg, es zu testen, bevor Sie versuchen, es zu löschen, besteht darin, es zuerst mit zu testen
ls
, da einige nicht erfasste Verhaltensweisen unerwünschte Dateien löschen könnten. Und Sie können dies direkt außerhalb des Verzeichnisses tun.ls
ist ähnlich wierm
, so:Dies wird aufgelistet
Und jetzt können Sie sehen, was Sie löschen und sie sicher löschen:
Und das ist es. Sie können Platzhalter verwenden
*
, um selektiver zu sein, wie z. B. nur Programmierunterlagen aufzubewahren:quelle