¿Cómo eliminar todos los archivos y directorios ocultos usando Bash?

28

La solución obvia produce un código de salida de 1:

bash$ rm -rf .*
rm: cannot remove directory `.'
rm: cannot remove directory `..'
bash$ echo $?
1

Una posible solución omitirá el "." y "..", pero solo eliminará archivos cuyos nombres tengan más de 3 caracteres:

bash$ rm -f .??*
Yonatan Broza
fuente
Bueno, si no estás demasiado preocupado por no poder eliminarlo. ¿Y a quién le importa? a menos que esté preocupado por la salida fea en un script, entonces creo que la solución obvia es escribir menos que los otros con toda franqueza.
Matt
Para que lo sepas, .. y. No son archivos. Son referencias a directorios. . (solo un punto) es el directorio actual, y ... (dos puntos) es un enlace al directorio un nivel más arriba. Por ejemplo, si cd / home / user,. es igual a / home / user y .. is / home / En otras palabras, no puede eliminar el. y .. (.?)
phuzion
Gracias por el comentario Matt. A menudo uso el comando en scripts con comprobación de código de salida por comando (set -e). En estos casos es necesario un código de salida indicativo.
Yonatan Broza
No hay nada inherente en. y .. eso los protege de la eliminación con rm -rf. Esto es solo un mecanismo de protección agregado en las variaciones modernas de rm.
kubanczyk
Y siempre hay rm -rf. * || true si solo desea evitar el comportamiento set -e para esa declaración.
Domingo Ignacio Galdos

Respuestas:

34
rm -rf. [^.]. ?? *

Debería atrapar todos los casos. El. ?? * solo coincidirá con los nombres de archivo de más de 3 caracteres (como se explicó en la respuesta anterior), el. [^.] Capturará cualquier entrada de dos caracteres (que no sea ...).

Russell Heilling
fuente
¡Gracias por la respuesta! En base a esto también llegué a la versión más corta de "rm -rf. [^.] *".
Yonatan Broza
44
Tenga cuidado con esa versión más corta, dará resultados similares, pero no idénticos. No coincidirá con los nombres con dos puntos en el frente (por ejemplo, "... /" que a veces se ve ocultando rootkits, etc.)
Russell Heilling
Y tenga cuidado al realizar una prueba de las personas con discapacidad o u desata toda su configuración :)
kommradHomer
Esto no parece funcionar zsh. ¿Alguna sugerencia?
ryanjdillon
Con zshforma predeterminada un partido de comodín vacío se trata como un error; mientras que con bashesto simplemente se pasa sin cambios. Para que se zshcomporte de la misma manera, puede usar el comandounsetopt nomatch
Russell Heilling
1
find -path './.*' -delete

Esto coincide con todos los archivos en el directorio actual que comienzan con .ay los elimina recursivamente. Los archivos ocultos en directorios no ocultos no se tocan.

En caso de que realmente quisieras borrar todo de un directorio, find -deletesería suficiente.

Fritz
fuente
Esto eliminará todo, no solo las entradas que comiencen.
kasperd
Oh, parece que leí mal la pregunta como "eliminar todo, incluidos los archivos ocultos" ... Bueno, mi problema.
Fritz
@kasperd Gracias, ahora debería responder la pregunta.
Fritz
0

La mejor manera probablemente es:

  • encontrar . -iname. * -maxdepth 1 -tipo f -exec rm {} \;

cambie rm a ls -l si solo desea ver lo que se eliminaría, para detallar la salida, es posible que desee agregar la opción -v a rm

  • -type f options le dice al comando find que busque solo archivos (omita directorios, enlaces, etc.)
  • -maxdepth 1 le dice a find que no baje a subdirectorios

PD. no te olvides de terminar '\;'


fuente
1
¡Cuidadoso! Te refieres a -iname '. *' O -iname. * O de lo contrario te arrastrarás. y ... otra vez de todos modos.
Domingo Ignacio Galdos
-1
ls -la | awk '$NF ~ /^\.[^.]+/  {print $NF}' | xargs rm -rf

ls -la ............. long list (all files and folders)
$NF ................ last field (file or folder name)
~   ................ Regular Expression match
/^\.[^.]+/ ......... dot followed by not dot at least once +

If the last field $NF match pattern show it and send 
it to xargs which will perform the task.
SergioAraujo
fuente
Esto rompe el instante en que tiene un archivo con espacios en blanco en su nombre.
un CVn