Come eliminare tutti i file tranne uno in Unix? [duplicare]


Risposte:


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

Esempio :

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

Per rimuovere tutti i file tranne 'test2':

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

Quindi l'output di "ls" è:

test2

MODIFICARE:

Grazie per il commento. Se la directory contiene alcuni file con spazi:

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

Puoi usare (con bash):

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

'ls' output:

test 1
test 4

Avrei fatto molto simile usando find, ma il tuo funziona e tu eri più veloce. +1
Rory Alsop,

2
questo non riesce se hai file con spazi nei loro nomi.
Mat

Per gestire i nomi dei file con spazi si potrebbe usarels -1 | grep -v do_not_delete | xargs -I files rm "files"
sebhofer

8

Supponendo che tu stia utilizzando la shell bash (il caso più comune), puoi usare il simbolo di negazione globbing (espansione del percorso):

rm -rf !(myfile.txt)

Questo utilizza il globbing esteso, quindi dovresti prima abilitare questo:

shopt -s extglob

1
 cp myfile.txt somewhere_else;
 rm -rf *
 cp somewhere_else/myfile.txt .

1
ln myfile.txt .myfile.txt && rm -rf * && mv .myfile.txt myfile.txt


0

Per un ricorsivo rmavresti bisogno di fare la ricorsione con finded escludere i file che volevi conservare (o grep, ma che potrebbero metterti nei guai degli spazi bianchi). Per un shell glob, le shell moderne hanno modelli glob che possono essere usati per escludere i file; questo può essere combinato con la ricorsione globale a livello di shell quando disponibile (ad es. zshha rm **/*~foo/bar- nota che è probabile che si verifichi in limiti di lunghezza degli argomenti per alberi di directory di grandi dimensioni).

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.