¿Cómo eliminar todos los archivos de un directorio?

289

Lo más cerca que he llegado es

# rm /path/to/directory/*.*

pero eso no funciona para archivos que no tienen una extensión ...

usuario784637
fuente

Respuestas:

340

Linux no usa extensiones. Depende del creador del archivo decidir si quiere que el nombre tenga una extensión. Linux mira el primer byte para descubrir qué tipo de archivo está tratando.

Para eliminar todo en un directorio use:

rm /path/to/directory/*

Puede usar la -ropción, por ejemplo:

rm -r /path/to/directory/*

para eliminar también cualquier subdirectorio (junto con todo su contenido) dentro del directorio del que está eliminando el contenido. De lo contrario, mostrará un error informándole que no está eliminando el directorio.

Rinzwind
fuente
13
Si también desea eliminar archivos ocultos shopt -s dotglobantes de ejecutarlosrm (...)
danjjl
77
El * significa all files;) *.*significa todos los archivos que contienen un .lugar en el nombre
Rinzwind
10
@Rinzwind, más exactamente, el asterisco significa "cero o más de cualquier carácter". Entonces *a*significa cero o más caracteres, aseguidos de cero o más caracteres. Sería coincidir con los nombres de archivo happy, apple, ao la.
DisgruntledGoat
77
@ user784637 te impresionas demasiado fácilmente
barlop
1
Aquí está el comando que desea: rm - *
anon58192932
168
  • Para eliminar la carpeta con todo su contenido ( incluidas todas las carpetas interiores ):

    rm -rf /path/to/directory
    
  • Para eliminar todo el contenido de la carpeta ( incluidas todas las carpetas interiores ) pero no la carpeta en sí:

    rm -rf /path/to/directory/*
    

    o

    rm -rf /path/to/directory/{*,.*}
    

    si desea asegurarse de que también se eliminen los archivos / directorios ocultos.

  • Para eliminar todos los "archivos" del interior de una carpeta ( sin eliminar las carpetas interiores ):

    rm -f /path/to/directory/{*,.*}
    


  • Advertencia : si tiene espacios en su camino, asegúrese de usar siempre comillas.

    rm -rf /path/to the/directory/*
    

    es equivalente a 2 rm -rfllamadas separadas :

    rm -rf /path/to
    rm -rf the/directory/*
    

    Para evitar este problema, puede usar 'comillas simples '( no expande las variables de shell) o "comillas dobles "( expande las variables de shell):

    rm -rf "/path/to the/directory/"*
    


Dónde:

  • rm- significa " eliminar "
  • -f- significa " forzar ", que es útil cuando no desea que se le pregunte / pregunte si desea eliminar un archivo, por ejemplo.
  • -r- significa " recursivo ", lo que significa que desea ir recursivamente a cada carpeta y eliminar todo.
Lilian A. Moraru
fuente
8
Encontré que esta es la respuesta más completa y útil, más allá de la respuesta que se marcó como Aceptada.
inspirado el
2
rm -rf /path/to/directory/*no elimina un archivo oculto en la carpeta, por ejemplo .htaccess. Tal vez rm -rf /path/to/directory/.? No lo he intentado.
Mark Berry
@MarkBerry rm -rf /path/to/directory/.*
Lilian A. Moraru
@ LilianA.Moraru, hice algunas pruebas hoy. rm -rf /path/to/directory/.*solo elimina los archivos ocultos en el directorio especificado. Mirando el comentario de @ danjjl sobre la respuesta de @ Rinzwind, para eliminar también los archivos ocultos, ejecute shopt -s dotglobantes de ejecutar rm -rf /path/to/directory/*.
Mark Berry
PRECAUCIÓN: rm -rf /path/to/directory/.*en mi sistema causó la eliminación de elementos en /path/to. Afortunadamente, acababa de hacer una copia de seguridad de todos mis datos en un disco separado. ¡No hace falta decir que NO ejecute el comando a rm -rf /path/to/directory/.*menos que haya hecho una copia de seguridad de toda su computadora en una ubicación separada / segura!
leyes el
43

Para eliminar todos los archivos en el directorio (incluidos los archivos ocultos y subdirectorios) ejecute:

rm -rf /path/to/directory/{*,.*}
Leonid V. Fedorenchik
fuente
1
Esta debería ser la hermosa respuesta aceptada. ¡Gracias!
Nam G VU
3
¿No coincide este glob "". ¿y también?
hertzsprung
44
@hertzsprung: lo hace, y le dará una advertencia de que no puede eliminar ./y ../, pero aún eliminará los archivos ocultos.
Ryan Wheale
Esto no funciona en la consola Mac, los archivos ocultos siguen ahí con esa línea de comando.
agapitocandemor
Para eliminar todo el directorio actual:rm -r $(pwd)/{*,.*}
Jimmy Adaro
10

Si desea eliminar solo los archivos en el directorio / ruta / al / puede hacerlo

find /path/to/directory -type f -print0| xargs -0 rm 

o

find /path/to/directory -type f -exec rm '{}' \;

Puede hacer cargas con find, la ventaja es que puede enumerar lo que se encuentra sin canalizarlo para rmque pueda ver lo que se eliminará antes de comenzar.

Richard Holloway
fuente
2
GNU findcomo -deletepredicado Si todavía desea usar -exec, la sustitución \;con +reunirá rmllamadas, aumentando la eficiencia.
enzotib
1
Una gran cantidad de archivos con '+' causará problemas, ya que la lista será demasiado grande, igual que rm -f *. y al eliminar grandes cantidades de archivos de la misma carpeta (hablando en millones), ambos no son buenos :) Al final, apareció C ++ y eliminó los archivos en orden de inodes en el árbol de directorios.
Osis
3
Realmente deberías agregar un - después del rm. Sin eso, si tiene un nombre de archivo, -rf o similar se interpretará como argumento para rm. por ejemplo, xargs -0 rm - o -exec rm - {} \;
Richm
También puede proporcionar el argumento -n a xargs. Eso hará que divida los comandos rm para tener un número máximo de argumentos, es decir, 'xargs -n 100 -0 rm -' eliminará los archivos en fragmentos de 100.
Richm
1
También puede agregar -maxdepth 1 para asegurarse de que find no devuelva archivos de ningún subdirectorio. es decir, encontrar / ruta / al / directorio -maxdepth 1 -type f
Richm
7

Para eliminar todos los archivos y directorios (incluidos los ocultos ) en un directorio, puede intentar lo siguiente:

  • elimine la carpeta, luego vuelva a crearla

    rm -rf dir_name && mkdir dir_name
    
  • utilizar find

    find dir_name -mindepth 1 -delete  
    

Aquí especificamos -mindepth 1para excluir el directorio dir_name en sí.
Eche un vistazo al siguiente enlace:
https://unix.stackexchange.com/questions/12593/how-to-remove-all-the-files-in-a-directory

zeekvfu
fuente
Gracias por su consejo y he agregado más explicaciones para los enlaces.
zeekvfu
3
¡Tenga cuidado, ya que eliminar y volver a crear la carpeta puede dar lugar a permisos diferentes / incorrectos para esta carpeta!
einjohn
6

Si también desea eliminar todos los subdirectorios y el directorio en sí, puede usar rm -rf /path/to/directory. Pero siempre verifique dos veces su línea antes de presionar Intro, también rm -rfpuede causar muchos estragos, por ejemplo, si inserta accidentalmente un espacio después de la primera barra oblicua mientras tiene permisos de superusuario ...

Tobias Kienzler
fuente
1

Dado que esta pregunta está constantemente en la parte superior de Google cuando la busco yo mismo:

Las otras respuestas sufren de diferentes problemas:

  1. Algunos de ellos incluyen .y ..que es ruidoso, confuso y molesto.

  2. Algunos de ellos olvidan los archivos ocultos (archivos que comienzan con un punto).

  3. No eliminan en un orden correcto (el más profundo primero) para permitir la eliminación del directorio.

  4. Descienden a otros sistemas de archivos (montados), que a menudo no son deseados.

  5. Son difíciles de extender adecuadamente con parámetros adicionales (más sobre eso a continuación).

Entonces, para RECURSARMENTE eliminar todos los archivos Y carpetas en un directorio, haga esto:

find "${DIR}" -xdev -mindepth 1 -printf "%d\t%y\t%p\0" | sort -z -r -n | cut -z -f3- | xargs -0 -r -- rm -d --

Tenga en cuenta que agregué un -xdevargumento para evitar descender a monturas (como /procetc.).

¿Por qué no -deptho -delete?

A pesar de que la gente me rechaza constantemente por esto, esos métodos tienen un inconveniente: no parece que sean lo suficientemente extensibles como para permitir -pruneun subdirectorio (sin introducir más problemas). En contraste con este método, podría insertar

-not \( -path "${DIR}/subdir" -prune \)

antes del -mindepthargumento para excluir subdirque se elimine su contenido.

Mehrdad
fuente
Y para el primer orden de profundidad, hay una -depthbandera findpara eso.
Sergiy Kolodyazhnyy
Uh ... ¿por qué no solo usar -deleteconfind ? -deletees profundo primero. Ya está asumiendo que no es POSIX findcon el -printf, por lo que podría usar -deleteo-depth -print0 | xargs -0 rm
muru
@muru: Porque no sabía mejor ... lo cambiaré.
Mehrdad
@muru: En realidad, parece que tu método no funciona -not \( -path "$DIR/subdir" \)... ¿pero el mío sí? ¿Por qué?
Mehrdad
@Mehrdad, ¿qué se supone que debe hacer?
muru
0

Puede cdingresar al directorio y luego ejecutar el comando rm *.*al igual que en DOS, si lo recuerda.

VK Mavani
fuente
1
DOS es DEL para archivos y RMDIR para directorios vacíos, y los archivos ocultos y del sistema deben tener esos atributos ATTRIB eliminados primero. No es tan simple;)
Eric
0

Para eliminar el directorio actual, podría usar, por ejemplo, rm -d ./*

-d le dice a eliminar directorios también.

Arviman
fuente