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
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
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'
find . \! -name 'file' -delete
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
find . \! -name '*pattern*' -print0 | xargs --null rm
-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án
Usando zsh, con setopt EXTENDED_GLOB
, usando el ~
operador ( excepto )
rm -- *~(x|y|z)
u ^
operador (negación):
rm -- ^(x|y|z)
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.
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):
$ shopt -s extglob # turn on extended globbing
$ rm !(X|Y|Z)
Para probar, le sugiero que primero reemplace rm
con echo
para ver si la lista de archivos a eliminar es lo que espera.
ls -1 | grep -v "^[XYZ]$" # | xargs rm -r
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
ls -1 | egrep -v "^file1$|^filename2$|^f1le$" # | xargs rm -r
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.
ls -1 | egrep -v "^(file1|filename2|f1le)$" # | xargs rm -r
a
, b
y a b
el primer programa se eliminará, si coloca ab en la parte grep: "^[ab]$"
a
y b
no a 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.
/
, ¿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.
#! /bin/bash
for dir in /PathToFolder/*
do
if [ ! "$dir" = "/PathToFolder/FolderToKeep1" ] && [ ! "$dir" = "/PathToFolder/FolderToKeep2" ] && [ ! "$dir" = "/PathToFolder/FolderToKeep3" ] && [ ! "$dir" = "/PathToFolder/FolderToKeep4" ] && [ ! "$dir" = "/PathToFolder/FolderToKeep5" ] && [ ! "$dir" = "/PathToFolder/FolderToKeep6" ] ; then
echo ${dir}
sudo rm -R $dir user
dscl . -delete $dir
fi
done
exit 0
Con GNU-find puede usar el modificador -delete, que también elimina los directorios, si están vacíos:
find tmp -not -name X -not -name Y -not -name Z -delete
find tmp -maxdepth 1 -not -name X -not -name Y -not -name Z -delete
es una forma de evitar esto.
tmp
si no hubiera archivos X
/ Y
/ Z
en él. Note !
como el equivalente estándar de GNU -not
( -delete
también es una extensión de GNU)