¿Cómo eliminar solo archivos, pero mantener la estructura de directorios?

16

Me gustaría eliminar todos los archivos, pero mantener la estructura de carpetas. ¿Hay alguna manera?

NOTA: (Estoy usando GNU bash 4.1.5).

Tom Brito
fuente
1
¿Cómo quieres decir exactamente "excluir"? ¿Estás usando un comando de algún tipo? Si es así, actualice su pregunta para incluir esto.
slm
Creo que te refieres a eliminar todos los archivos.
slm
1
@slm Actualicé con el comando que usualmente uso para excluir archivos.
Tom Brito
No, no lo has hecho :-) O, si lo hiciste, lo
quitaste

Respuestas:

17

Prueba esto:

find . ! -type d -exec rm '{}' \;

Esto eliminará todos los archivos, excepto los directorios, debajo del directorio de trabajo actual. Ten mucho cuidado con este comando.

Si la versión de findsu máquina lo admite, también puede usar

find . ! -type d -delete

fuente
@SLM: No estoy seguro de lo portátil que es. Lo he agregado como una opción secundaria. Me acabo de dar cuenta de que mi edición hizo que mi respuesta sea prácticamente idéntica a la tuya. Lo siento por eso; No fue mi intención.
¿El '{}' protege contra espacios en los archivos? Te veo usando todo el tiempo y no creo haberlo visto antes de verte publicando soluciones con él.
slm
En la página de manual de GNU find: "Observe que los corchetes están encerrados entre comillas simples para protegerlos de la interpretación como puntuación de script de shell". Sin embargo, no estoy seguro de cuándo es necesario. Principalmente lo hago por costumbre. El findcomando nunca ve las comillas. Simplemente ve el {}marcador como un argumento.
Lo veo en el ejemplo, pero las plantillas muestran esto, " -exec command {} +" y esto " -exec command ;". He usado el \;en el pasado simplemente nunca el '{}'.
slm
@slm: las plantillas tampoco muestran el escape del punto y coma, que generalmente es necesario cuando se utiliza un shell para ejecutar find. Creo que las plantillas están destinadas a mostrar qué argumentos findnecesita el comando y no preocuparse por nada relacionado con shell.
7

Puede usar el comando findpara localizar cada archivo pero mantener la estructura del directorio:

$ find /some/dir -type f -exec rm {} +

Según estas preguntas y respuestas de Unix y Linux tituladas: gnu encuentra y enmascara el {} para algunos shells, ¿cuál? , escapar {}con ticks individuales ( ') ya no parece ser necesario con shells modernos como Bash.

slm
fuente
1

La forma fácil de eliminar todos los archivos regulares en el directorio y subdirectorios actuales de forma recursiva:

zsh -c 'rm **/*(.)'

Solo zsh tiene calificadores globales para hacer coincidir los archivos por tipo. Sin embargo, el rmcomando no funciona en directorios, por lo que en bash, puede usar

shopt -s globstar
rm **/*

Esto no funciona para otros comandos que no sean rm. En general, puedes usar find:

find . -type f -delete

o si tu findno es compatible -delete:

find . -type f -exec rm {} +
Gilles 'SO- deja de ser malvado'
fuente
-2

Tenía un requisito similar para eliminar archivos de una ruta y sus subdirectorios (filtrado por tiempo) sin eliminar la estructura del directorio.

Y he usado el siguiente formato que funcionó para mí.

find / test123 / home / test_file_hip / data / nfs -mtime +6 -type f -exec rm {} \;

Syntex: find (ruta del archivo) -mtime (mayor o menor que días) -type f -exec rm {} \;

-tipo: Mencione el tipo de archivo "f" para el directorio "d" -exec: ejecute el comando rm: remove {}: salida del comando find

Nota: Pruébelo antes de usarlo. No dude en corregir o actualizar si me perdí algo.

rohit
fuente
1
dado que este es un requisito adicional que no fue mencionado por el OP, y dado que la find ... rmestructura básica ya ha sido cubierta, no estoy seguro de que esta sea una contribución valiosa como una nueva Respuesta a esta pregunta.
Jeff Schaller