2013-01-08 12:17:05 +0000 2013-01-08 12:17:05 +0000
123
123

Wie lösche ich alle Dateien in einem Verzeichnis außer einigen?

Ich muss alle Dateien in einem Verzeichnis löschen, aber einige von ihnen ausschließen. Zum Beispiel muss ich in einem Verzeichnis mit den Dateien a b c ... z alle außer u und p löschen. Gibt es eine einfache Möglichkeit, dies zu tun?

Antworten (17)

144
144
144
2013-01-08 12:34:49 +0000

Um rm alle außer u,p in der Bash einzugeben, geben Sie einfach ein:

rm !(u|p)

Dazu muss die folgende Option gesetzt sein:

shopt -s extglob

Siehe mehr: glob - Gregs Wiki

108
108
108
2013-01-08 12:18:23 +0000

Was ich in solchen Fällen mache, ist,

rm *

einzugeben. Dann drücke ich Strg+X,* um * in alle sichtbaren Dateinamen zu expandieren.

Dann kann ich einfach die beiden Dateien, die ich behalten möchte, aus der Liste entfernen und schließlich die Befehlszeile ausführen.

71
71
71
2013-01-08 12:35:05 +0000

Sie können find

find . ! -name u ! -name p -maxdepth 1 -type f -delete

verwenden - ! negiert den nächsten Ausdruck - -name gibt einen Dateinamen an - -maxdepth 1 lässt find nur das angegebene Verzeichnis verarbeiten (find durchläuft standardmäßig Verzeichnisse) - -type f verarbeitet nur Dateien (und nicht z.B. Verzeichnisse)

- -delete löscht die Dateien

-print löscht die Dateien

Sie können dann die Bedingungen anpassen, indem Sie in der man page von find

Update

  • Beachten Sie, dass die Reihenfolge der Elemente der Ausdrücke von Bedeutung ist (siehe Dokumentation)
  • Testen Sie Ihren Befehl zuerst, indem Sie -delete anstelle von 0x6& verwenden
43
43
43
2013-01-08 12:22:58 +0000

Einfach:

mv die gewünschten Dateien in einem oberen Verzeichnis, rm das Verzeichnis und dann mv sie zurück.

15
15
15
2013-01-08 14:22:21 +0000

Ähnlich wie diese Antwort , aber es werden keine speziellen Optionen benötigt. Soweit ich weiß, ist das Folgende eine “uralte” Funktionalität, die von jeder (vage) /bin/sh-ähnlichen Shell unterstützt wird (z. B. bash, zsh, ksh, etc.)

rm [^up]
11
11
11
2013-01-09 03:54:14 +0000

Ohne “find” zu machen:

ls | grep -v '(u|p)' | xargs rm

(Bearbeiten: “u” und “v” werden hier, wie auch an anderen Stellen, als generische Versionen ganzer Regexe verwendet. Offensichtlich müssen Sie darauf achten, Ihre Regexe zu verankern, um zu vermeiden, dass sie auf zu viele Dinge passen).

Sie werden auf jeden Fall ein Skript benötigen, wenn Sie viel davon machen wollen, wie andere vorgeschlagen haben.

6
6
6
2013-01-09 22:34:13 +0000

In zsh:

setopt extended_glob # probably in your .zshrc

dann

rm ^(u|p)

oder

rm *~(u|p)

Das zweite funktioniert auch, wenn Sie ^ in $histchars für die Historienersetzung haben, und natürlich können Sie ein beliebiges glob vor das ~ setzen.

5
5
5
2013-01-08 16:32:06 +0000

GLOBIGNORE nimmt eine durch Doppelpunkte getrennte Liste

GLOBIGNORE=u:p
rm *
3
3
3
2013-01-08 17:58:46 +0000
find . -maxdepth 1 ! -name "u" ! -name "p" -type f -exec rm -rf {} \;

Damit werden alle Dateien außer u und p unter Unix gelöscht

3
3
3
2013-01-08 17:02:15 +0000

Damals, in der Floppy-Ära, hatte ich ein Dos-Executable namens “Except”, das Dinge temporär aus dem aktuellen Verzeichnis verschob und einen Befehl ausführte, so dass Sie sagen konnten:

except \*.txt del \*.\*

, um alles außer Ihren Textdateien zu löschen.

Das wäre eine ziemlich triviale Sache, die man als Shell-Skript implementieren könnte, und wenn Sie so etwas wahrscheinlich mehr als zweimal tun werden, scheint es eine gute Idee zu sein.

2
2
2
2013-01-08 18:16:45 +0000

Für diejenigen, die es bevorzugen, beliebig komplexe Ausschlussmuster (die alle betroffenen Dateinamen umfassen) in einem vollwertigen Regexp im Stil von emacs, posix-awk oder posix-extended (siehe find man page) anzugeben, empfehle ich dieses. Sie schließt u und p im aktuellen Verzeichnis in diesem Beispiel aus. Dies kann für Skripte praktisch sein.

find -regextype posix-awk ! -regex './(u|p)' -print0 | xargs -0 rm -rf
1
1
1
2014-09-24 03:05:26 +0000

Noch eine andere:

for FILE in ./*; do if [[$FILE != ./u*]] || [[$FILE != ./p*]];then rm $FILE; fi; done;

Es ist etwas langatmig und ich weiß nicht, ob man es leicht in eine Funktion umwandeln kann, die eine beliebige Anzahl von Argumenten aufnehmen kann, aber es funktioniert gut.

Und es ist pure Bash-Güte.

1
1
1
2014-10-22 12:37:57 +0000

Hier ist eine weitere Variante. Sie können eingeben:

rm -i *

oder:

rm --interactive *

Also wird rm Sie auffordern, das Löschen jeder Datei zu bestätigen.

1
1
1
2016-09-11 02:33:03 +0000

Verwenden Sie:

find . -type f ! -name 'u' ! -name 'p' ! -name '*.ext' -delete
find . -type d ! -name 'u' ! -name 'p' ! -name '*.ext' -delete

, um alle Dateien einschließlich Verzeichnisse zu löschen, außer u-, p- und .ext-Dateien.

1
1
1
2013-01-09 20:54:59 +0000

Ich verwende immer:

rm [a-o,q-t,v-z]*

Damit können Sie festlegen, wie granular Sie es machen wollen. Wenn Sie also die Dateien a bis o und Z löschen wollen, können Sie verwenden:

rm [a-o,z]*
1
1
1
2013-04-01 12:44:13 +0000

Eine weitere Version mit xargs:

ls -1 | grep -v do_not_delete | xargs -I files rm "files"

Beachten Sie, dass xargs -I benötigt wird, um Dateinamen mit Leerzeichen korrekt zu behandeln.

0
0
0
2013-10-22 07:06:44 +0000

Ein einfacher Weg, der schwer zu verpatzen ist: Nehmen wir an, Sie wollen alles außer *.pdf löschen:

mkdir tmp
mv *.pdf tmp
rm *
mv tmp/* .
rm -r tmp