¿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 .??*

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 ...).


¡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.


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 '\;'


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.

Esto rompe el instante en que tiene un archivo con espacios en blanco en su nombre.
un CVn
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.