¿Cómo eliminar todos los archivos menos uno en Unix? [duplicar]

Respuestas:

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

Ejemplo:

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

Para eliminar todos los archivos excepto 'test2':

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

Entonces la salida 'ls' es:

test2

EDITAR:

Gracias por el comentario. Si el directorio contiene algunos archivos con espacios:

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

Puedes usar (con bash):

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

Salida 'ls':

test 1
test 4
Sandro Munda
fuente
Iba a hacer algo muy similar usando find, pero el suyo funciona y usted fue más rápido. +1
Rory Alsop
2
esto falla si tiene archivos con espacios en sus nombres.
Mat
Para manejar nombres de archivos con espacios, se podría usarls -1 | grep -v do_not_delete | xargs -I files rm "files"
sebhofer
8

Suponiendo que está utilizando el shell bash (el caso más común), puede usar el símbolo de negación global (expansión del nombre de ruta):

rm -rf !(myfile.txt)

Esto usa globbing extendido, por lo que primero deberá habilitar esto:

shopt -s extglob
Lauren
fuente
1
 cp myfile.txt somewhere_else;
 rm -rf *
 cp somewhere_else/myfile.txt .
Rayfleck
fuente
1
ln myfile.txt .myfile.txt && rm -rf * && mv .myfile.txt myfile.txt
jlliagre
fuente
0

Para un recursivo rm, necesitaría hacer la recursión findy excluir los archivos que desea conservar (o grep, pero eso puede meterlo en problemas de espacio en blanco). Para un glob de shell, los shells modernos tienen patrones de glob que pueden usarse para excluir archivos; esto se puede combinar con la recursividad global de nivel de shell cuando esté disponible (por ejemplo, zshtiene rm **/*~foo/bar- tenga en cuenta que es probable que esto se encuentre con límites de longitud de argumento para grandes árboles de directorios).

geekosaur
fuente