Wie lösche ich alle bis auf eine Datei in Unix? [Duplikat]

Antworten:

20
ls * | grep -v dont_delete_this_file | xargs rm -rf 

Beispiel:

mkdir test && cd test
touch test1
touch test2
touch test3
touch test4
touch test5

So entfernen Sie alle Dateien außer 'test2':

ls * | grep -v test2 | xargs rm -rf

Dann lautet die Ausgabe von 'ls':

test2

BEARBEITEN:

Danke für den Kommentar. Wenn das Verzeichnis einige Dateien mit Leerzeichen enthält:

mkdir test && cd test
touch "test 1"
touch "test 2"
touch "test 3"
touch "test 4"
touch "test 5"

Sie können (mit Bash) verwenden:

rm !("test 1"|"test 4")

'ls' Ausgabe:

test 1
test 4
Sandro Munda
quelle
Wollte mit find sehr ähnlich vorgehen, aber deine funktioniert und du warst schneller. +1
Rory Alsop
2
Dies schlägt fehl, wenn Sie Dateien mit Leerzeichen im Namen haben.
Mat
Um mit Dateinamen mit Leerzeichen ls -1 | grep -v do_not_delete | xargs -I files rm "files"
umzugehen,
8

Angenommen, Sie verwenden die Bash-Shell (der gängigste Fall), können Sie das Negationsglobbing-Symbol (Pfadnamenerweiterung) verwenden:

rm -rf !(myfile.txt)

Dies verwendet erweitertes Globbing, daher müssten Sie dies zuerst aktivieren:

shopt -s extglob
Lauren
quelle
1
 cp myfile.txt somewhere_else;
 rm -rf *
 cp somewhere_else/myfile.txt .
Rayfleck
quelle
1
ln myfile.txt .myfile.txt && rm -rf * && mv .myfile.txt myfile.txt
jlliagre
quelle
0

Für ein rekursives rmVerfahren müssen Sie die Rekursion mit findden Dateien durchführen und diese ausschließen, die Sie behalten möchten (oder grep, aber dies kann zu Problemen mit Leerzeichen führen). Bei einem Shell-Glob haben moderne Shells Glob-Muster, mit denen Dateien ausgeschlossen werden können. Dies kann mit einer Glob-Rekursion auf Shell-Ebene kombiniert werden, sofern verfügbar (z. B. zshhat rm **/*~foo/bar- Beachten Sie, dass dies wahrscheinlich zu Längenbeschränkungen für Argumente bei großen Verzeichnisbäumen führt).

Geekosaurier
quelle