Mögliches Duplikat:
Wie lösche ich alle Dateien in einem Verzeichnis mit Ausnahme einiger?
Wie lösche ich alle bis auf eine (oder einige) Datei in Unix?
Etwas wie
rm -rf -ignore myfile.txt *
Mögliches Duplikat:
Wie lösche ich alle Dateien in einem Verzeichnis mit Ausnahme einiger?
Wie lösche ich alle bis auf eine (oder einige) Datei in Unix?
Etwas wie
rm -rf -ignore myfile.txt *
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
ls -1 | grep -v do_not_delete | xargs -I files rm "files"
Angenommen, Sie verwenden die Bash-Shell (der gängigste Fall), können Sie das Negationsglobbing-Symbol (Pfadnamenerweiterung) verwenden:
Dies verwendet erweitertes Globbing, daher müssten Sie dies zuerst aktivieren:
quelle
quelle
quelle
Diese Seite bietet je nach Shell verschiedene Optionen: http://www.unix.com/unix-dummies-questions-answers/51400-how-remove-all-except-one-file.html
quelle
Für ein rekursives
rm
Verfahren müssen Sie die Rekursion mitfind
den Dateien durchführen und diese ausschließen, die Sie behalten möchten (odergrep
, 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.zsh
hatrm **/*~foo/bar
- Beachten Sie, dass dies wahrscheinlich zu Längenbeschränkungen für Argumente bei großen Verzeichnisbäumen führt).quelle