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


76

Estoy tratando de eliminar todos los archivos y subdirectorios en un directorio. Solía rm -reliminar todos los archivos, pero quiero eliminar todos los archivos y subdirectorios, excluyendo el directorio superior en sí.

Por ejemplo, tengo un directorio superior como images. Contiene los archivos header.png, footer.pngy un subdirectorio.

Ahora quiero eliminar header.png, footer.pngy el subdirectorio, pero no images.

¿Cómo puedo hacer esto en Linux?


1
cd en el directorio y hacer uno rm -Rfde todos los archivos y directorios allí.
Noufal Ibrahim

Respuestas:


59

Si se llama a su directorio de nivel superior images, ejecute rm -r images/*. Esto utiliza el operador de shell glob *para ejecutarse rm -ren cada archivo o directorio dentro images.


30
el archivo oculto no se eliminará.
reto

51

Para eliminar archivos ocultos, debe especificar:

rm -r images/* images/.*

Con proyectiles cuyos globos incluyen .y .., esto conducirá a un error como

rm: cannot remove `.' directory `images/.'
rm: cannot remove `..' directory `images/..'

pero eliminará los archivos ocultos.

Un enfoque sin mensaje de error es usar find / delete con mindepth. Esto es gnu-find.

find images -mindepth 1 -delete

Su hallazgo puede carecer del predicado -mindeptho -delete, en cuyo caso, podría hacer:

find images/. ! -name . -prune -exec rm -rf {} +

Mi sugerencia fue usar 'rm -r images /.*' que coincidiría con 'images / ..' pero no con 'images /../ ..'. La recursividad no puede subir, ya que 'images /../ images / ..' vuelve a ser el mismo directorio.
usuario desconocido

44
@DarkHeart rm .*no elimina .o ..y no tiene por lo menos desde 1994 para las herramientas GNU y es probable que desde finales de los años 70 para UNIX . Es extremadamente improbable que encuentre un sistema donde rm .*atraviese el sistema de archivos hacia arriba fuera de un museo.
terdon

21

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

  • se usa ls -Abpara hacer coincidir todos los archivos / directorios

    cd dir_name && rm -rf `ls -Ab`
    
  • se usa findpara hacer coincidir todos los archivos / directorios

    find dir_name -mindepth 1 -delete
    

    o, si su findno es compatible -delete:

    find dir_name -mindepth 1 -exec rm -rf {}
    
  • elimine la carpeta, luego vuelva a crearla

    rm -rf dir_name && mkdir dir_name
    
  • en bash,

    shopt -s dotglob  
    rm -rf dir_name/*
    

Tenga en cuenta que el comando like rm -rf *no es seguro si no tiene conocimiento de los archivos en un directorio, porque un archivo que comienza con -(guión) se interpretará como un rmindicador ...
VasyaNovikov

1
EDITAR: para hacerlo seguro, userm -rf ./* ./.*
VasyaNovikov

9

Para eliminar todos los archivos regulares de forma recursiva dentro de un directorio, este comando (suponiendo GNU o FreeBSD find) es lo suficientemente bueno:

find . -type f -delete

Eso deja todos los archivos no regulares como enlaces simbólicos (ya sea que apunten a archivos normales o no), directorios, quince, sockets, dispositivos ...

Ver también:

find . ! -type d -delete

para eliminar archivos de cualquier tipo excepto el directorio .


6

Prueba esta versión:

 rm -r test/*

1
Esto no eliminará los archivos ocultos (los que comienzan con ".").
gbmhunter

3

Estoy usando el findcomando aquí:

Paso 1: busque todos los archivos y elimínelos:

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

Ejemplo:

find /home/user/Desktop/images/ -type f -exec rm {} \;

Paso 2: busque todos los subdirectorios y elimínelos:

find /path/to/directory/ -type d -exec rm -R {} \;

find /path/to/directory/ -type dincluye .lo que eliminará el directorio en sí. También debe usar el -mindepthinterruptor como han dicho otros.
Arthur Tacca el

3

La pregunta era vaciar un directorio = eliminar el contenido de un directorio, incluidos los archivos ocultos, pero no el directorio en sí. El comando find con -mindepth 1 es en realidad la forma correcta de hacerlo, pero para evitar mensajes de error debe unirse con -maxdepth 1:

find /path/to/dir -mindepth 1 -maxdepth 1 -exec rm -rf '{}' \;

0

La sintaxis de rm es:

rm [OPTION]... FILE...

Por lo tanto, debe indicar la ruta apropiada explícitamente, por ejemplo

rm -r sub_dir/

0

Puede eliminar el directorio con el siguiente comando:

sudo rm -r directoryname1/2/3/*

Se eliminará todo el directorio después de 3 / *.

Ejemplo sudo rm -r Descargas / canción / *

Se eliminarán todos los archivos que estén dentro Downloads/song.


0

Esto funciona perfectamente para mí, probé varias variaciones que funcionaron cada vez.

Desde el directorio que contiene el directorio de imágenes.

rm -frd ./images/*

antes de:

images/
    |_ header.png
    |_ footer.png
    |_ subdir/

después:

images/

No estoy seguro de que quede claro en la pregunta original, pero solo para señalar que a menos que habilite dotglob, esto omitirá cualquier "archivo de puntos" o directorio de puntos debajo de las imágenes ( mkdir images/.somedir; touch images/.somefile)
Jeff Schaller

0

Para eliminar todos los archivos y subdirectorios en el directorio actual, incluidos los ocultos, sin mensaje de error :

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

O, desde el directorio padre:

rm -rf images/.[^.] images/.??* images/*

Desde https://serverfault.com/a/47940/269538 .



-2

Elimine la carpeta "prueba" y todos los archivos dentro:

 rm -r test

Elimine todos los archivos dentro pero mantenga la carpeta "prueba":

 rm -r test/*

-4

cd en la carpeta y luego ejecute el siguiente comando:

ls |xargs rm -rf

2
Esto fallará en los nombres de archivo que contienen espacios en blanco. Recomendaría no usar la salida de ls como entrada para otros comandos, generalmente no es seguro.
dhag
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.