Tengo muchos archivos y carpetas en una carpeta específica y quiero eliminarlos todos; Sin embargo, quería mantener los archivos X, Y y Z.
¿Hay alguna manera de que pueda hacer algo como: rm * | but NOT grep | X or Y or Z
command-line
rm
Amit
fuente
fuente
Respuestas:
En lugar de usar rm, puede ser más fácil usar find . Un comando como este eliminaría todo excepto un archivo llamado exactamente 'archivo'
Muchas versiones de deberían ser compatibles con el globing y la coincidencia de expresiones regulares.
También puede canalizar la salida de find a rm también
fuente
-delete
y qué archivos se guardarán al eliminar-delete
y\!
.find
es recursivo! por lo que todos los subdirectorios de archivos que no coincidan con el ' patrón ' también se eliminaránUsando zsh, con
setopt EXTENDED_GLOB
, usando el~
operador ( excepto )u
^
operador (negación):Pero, probablemente debería mover los archivos a otra parte, luego eliminar todo. Es mucho más seguro en términos de deslizamientos de los dedos, como presionar enter demasiado pronto.
fuente
Las versiones posteriores de bash tienen la
extglob
opción de shell que le brinda una sintaxis para hacer lo que desea (consulte su página de manual en "Expansión del nombre de ruta" para ver si su versión instalada la tiene):Para probar, le sugiero que primero reemplace
rm
conecho
para ver si la lista de archivos a eliminar es lo que espera.fuente
Atención: ejecute el comando y si los archivos que se van a eliminar son los correctos, ejecútelo nuevamente y elimine el carácter hash "#".
Si los nombres de archivo son más complicados que eso, haz
Nuevamente, primero mire los resultados y luego elimine el signo hash.
Esta versión, como se sugiere en los comentarios, guarda algunos caracteres y se ve un poco más clara.
fuente
egrep
argumento a"^(file1|filename2|f1le)$"
a
,b
ya b
el primer programa se eliminará, si coloca ab en la parte grep:"^[ab]$"
a
yb
noa b
, simplemente se opone a sus intenciones. El segundo comando hará lo mismo. Y el tercero también. No debe usar 'ls' en los scripts, con muy, muy raras excepciones. Solo no lo hagas.Mueva los archivos que desea mantener alejados. Suba un nivel, elimine la carpeta. Vuelva a crear la carpeta y mueva esos archivos hacia atrás.
fuente
/
, ¿eh? No muy practico. c) Intentar eliminar todos los archivos en tu$HOME
tampoco es realmente práctico.Esto es lo que configuré como un script .sh para un enlace de cierre de sesión OSX / MacOS, funciona bastante bien.
fuente
Con GNU-find puede usar el modificador -delete, que también elimina los directorios, si están vacíos:
fuente
find tmp -maxdepth 1 -not -name X -not -name Y -not -name Z -delete
es una forma de evitar esto.tmp
si no hubiera archivosX
/Y
/Z
en él. Note!
como el equivalente estándar de GNU-not
(-delete
también es una extensión de GNU)