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.