Ich habe ein Verzeichnis mit einer großen Anzahl von Dateien. Ich möchte alle Dateien außer file.txt löschen. Wie mache ich das?
Es gibt zu viele Dateien, um die unerwünschten Dateien einzeln zu entfernen, und ihre Namen sind zu unterschiedlich, um sie alle mit Ausnahme dieser einen Datei mit * zu entfernen.
Jemand schlug vor, mit
rm !(file.txt)
Aber es geht nicht. Es gibt zurück:
Badly placed ()'s
Mein Betriebssystem ist Scientific Linux 6.
Irgendwelche Ideen?
file-management
Kantura
quelle
quelle
Antworten:
POSIXly:
entfernt alle regulären Dateien (rekursiv, einschließlich versteckter) mit Ausnahme von
file.txt
. Um Verzeichnisse zu entfernen, wechseln Sie-type f
zu-type d
und fügen Sie die-r
Option zu hinzurm
.Für
bash
die Verwendungrm -- !(file.txt)
müssen Sie extglob aktivieren :(oder anrufend
bash -O extglob
)Beachten Sie, dass
extglob
nur in derbash
Korn-Shell-Familie funktioniert . Und die Verwendungrm -- !(file.txt)
kann einenArgument list too long
Fehler verursachen.In
zsh
können Sie das^
Muster mit aktiviertem extendedglob negieren :oder mit der gleichen Syntax mit
ksh
undbash
mit Optionenksh_glob
undno_bare_glob_qual
aktiviert.quelle
rm
asecho rm
und fordere die Leute auf, das Echo nur dann zu löschen, wenn sie wirklich sicher sind, dass es das tut, was sie wollen. Ansonsten +1 für die gründliche Antwort-delete
stattdessen vorschlagen-exec
, kürzer und leichter zu merken-delete
wird von POSIX nicht definiert.find
können Sie mit Gnoucs Lösung! \( -name one_file -o -name two_file \)
und so weiter vorgehen .Eine andere Einstellung in eine andere Richtung (falls die Dateinamen keine Leerzeichen enthalten)
oder (funktioniert auch, wenn Dateinamen Leerzeichen enthalten)
von
man grep
:quelle
ls | grep -v "a file with spaces.bin" | xargs rm
. Dies ist normalegrep
Syntax.grep
aberrm
.rm
wird eine Liste von durch Leerzeichen getrennten Argumenten erhalten. Versuchen Sietouch 'a b'; touch 'c d'; ls | grep -v 'a b' | xargs rm
: Sie erhaltenrm: c: No such file or directory
undrm: d: No such file or directory
-print0
infind
und-0
inxargs
. Hier ist eine Problemumgehung, die jedoch etwas umständlich ist.find . -maxdepth 1 -type f | grep -v 'a b' | tr '\n' '\0' | xargs -0 rm
. Übrigens, Gnuparallel
handhabt das gut (ich benutze es fast immer als Ersatz für xargs:ls | grep -v 'a b' | parallel rm
-
.Kopie pflegen, alles löschen, Kopie wiederherstellen:
In einer Zeile:
Das setzt aber eine Shell voraus, die Here-Strings unterstützt.
quelle
rm
und stirbttar -x
.rm
kann so oft scheitern, wie es will.das überdenkt ihr alle.
Getan.
EDIT Eigentlich einfacher:
quelle
Auf meinem Scientific Linux 6-Betriebssystem funktioniert Folgendes:
Ich habe auch Debian 32bit auf einer virtuellen Maschine installiert. Das Obige funktioniert nicht, aber das Folgende funktioniert:
quelle
find
Lösung, die ich gegeben habe, hat nicht funktioniert?file.txt
oder sonst etwas?shopt
ist keintcsh
Builtin.Verwenden Sie
rm !("file.txt")
anstelle vonrm !(file.txt)
quelle
shopt -s extglob
. In jedem Fall hätte das Zitieren eines einfachen Dateinamens keinen Unterschied gemacht.Um eine andere Antwort zu geben, können Sie das Standardverhalten verwenden, bei dem
rm
Ordner nicht gelöscht werden:quelle
Ich finde, dass dieser Ansatz sehr einfach ist, funktioniert und keine speziellen Erweiterungen erfordert (die ich kenne!)
quelle