Ich habe ein Verzeichnis mit vielen 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 einzeln zu entfernen, und ihre Namen sind zu unterschiedlich, um sie mit * außer dieser einen Datei zu entfernen.
Jemand hat vorgeschlagen,
zu verwendenrm !(file.txt)
Aber es funktioniert nicht. Es gibt zurück:
Badly placed ()'s
Mein Betriebssystem ist Scientific Linux 6.
Irgendwelche Ideen?
Akzeptierte Antwort:
POSIXly:
find . ! -name 'file.txt' -type f -exec rm -f {} +
entfernt alle regulären Dateien (rekursiv, einschließlich versteckter) außer file.txt
. Um Verzeichnisse zu entfernen, ändern Sie -type f
zu -type d
und fügen Sie -r
hinzu Option zu rm
.
In bash
, um rm -- !(file.txt)
zu verwenden müssen Sie extglob:
$ shopt -s extglob
$ rm -- !(file.txt)
(oder Aufruf von bash -O extglob
)
Beachten Sie, dass extglob
funktioniert nur in bash
und Korn-Shell-Familie. Und mit rm -- !(file.txt)
kann dazu führen, dass eine Argument list too long
wird Fehler.
In zsh
, können Sie ^
verwenden um Muster mit aktiviertem Extendedglob zu negieren:
$ setopt extendedglob
$ rm -- ^file.txt
oder die gleiche Syntax mit ksh
verwenden und bash
mit Optionen ksh_glob
und no_bare_glob_qual
aktiviert.