¿Cómo elimino todos los directorios vacíos en un directorio desde la línea de comandos?

58

Digamos que tengo un directorio llamado foo/. Esta carpeta incluye subdirectorios. ¿Cómo puedo eliminar todos los directorios vacíos en un comando?

justingrif
fuente

Respuestas:

119

Prueba este comando:

find . -empty -type d -delete

El findcomando se utiliza para buscar archivos / directorios que coincidan con un criterio de búsqueda particular de la ruta especificada, en este caso el directorio actual (de ahí el .).

La -emptyopción es válida para cualquier archivo y directorio que esté vacío.

La -type dopción es verdadera para el tipo de archivo especificado; en este caso drepresenta el directorio del tipo de archivo .

La -deleteopción es la acción a realizar, y es válida para todos los archivos encontrados en la búsqueda.

Cuenta
fuente
Creo que esta es la forma más fácil de hacerlo, así que voy a seguir adelante y marcarlo como respondido.
justingrif
Hola Bill, traté de publicar otra pregunta similar y no me dejó porque decía que era un tonto, así que esperaba que pudieras responderme aquí. Digamos que quería hacer lo mismo que antes pero eliminar todos los directorios si están vacíos o no.
justingrif 03 de
3
La forma en que le quite directorios, independientemente de si están o no están vacías, escriba el siguiente comando: rm -rf <directory-name>. Esto eliminará el directorio, junto con todo su contenido, incluidos archivos y subdirectorios. La -ropción significa eliminar de forma recursiva, mientras que el -fcomando significa no solicitar antes de eliminar. Sin embargo, si desea que se le solicite antes de eliminar un directorio / archivo, reemplace la -fopción con la -iopción.
Bill el
¿Qué pasaría si hubiera algunos archivos en dicho directorio que quisiera mantener? Entonces, quería eliminar todos los directorios en / foo / bar / pero mantener los archivos que pudieran estar allí.
justingrif el
2
Es posible hacer esto utilizando una tubería para alimentar el stdoutcomando de un (p find. Ej. ) Al stdinotro (p rm. Ej. ), Sin embargo, tenga mucho cuidado ya que puede borrar o eliminar archivos / directorios que no desea ¡Eliminar! Para obtener más información sobre cómo hacer esto, consulte las manpáginas para cada uno de estos comandos. Para estar seguro, siempre pruebe tales cosas en un directorio temporal antes de probar la cosa real.
Bill el
11

Puede aprovechar la rmdirnegativa del comando a eliminar directorios no vacíos y la find -depthopción de recorrer el árbol de directorios de abajo hacia arriba:

find . -depth -exec rmdir {} \;  

(e ignorar los errores), o agregar 2>/dev/nullpara ignorarlos realmente.

La -depthopción para findcomenzar a buscar en la parte inferior del árbol de directorios.

rm -rfeliminará todos los archivos en el directorio (y sus subdirectorios, y ....) Y todos los directorios y todo.

Waltinator
fuente
8
rmdir *

Eliminará todos los directorios vacíos. Lanzará un error para cada directorio y archivo no vacío, para evitar que esos errores abarroten su terminal, use

rmdir * 2> /dev/null
maldad
fuente
Esto no es adecuado para las secuencias de comandos, ya que saldrá con un código de estado distinto de cero, pero funciona.
the_drow
@the_drow ¿cómo se hace inadecuado? Por cierto también puedes usar rmdir * 2>/dev/null || true. (La forma find (1) es mejor para los scripts pero por otra razón: porque expresa mejor lo que quieres hacer.)
Alois Mahdal
A menudo hago esto a las $HOME. Con una sonrisa malvada.
Alois Mahdal
Porque informará un error si algunos de los directorios no están vacíos.
the_drow
¿Es esto más rápido que el método de búsqueda? ¿Alguien ha comparado los dos?
Xerus
1
find . -type d -empty -delete -maxdepth 1

Por si solo desea eliminar los subdirectorios directos de foo/.

Simon Baars
fuente
0

Enfoque de Python

$ tree                                                                                                                                                                                  
.
├── empty_dir1
├── empty_dir2
├── subdir1
│   ├── file1.abc
│   └── file2.abc
└── subdir2
    ├── file1.abc
    └── file2.abc

4 directories, 4 files
$ python -c 'import os;empty=[r for r,s,f in os.walk(".") if not f and not s and r != "." ];map(lambda x: os.rmdir(x),empty)'
$ tree
.
├── subdir1
│   ├── file1.abc
│   └── file2.abc
└── subdir2
    ├── file1.abc
    └── file2.abc

Esto funciona así:

  • Usamos la os.walk()función para caminar recursivamente el árbol de directorios. En cada iteración rse establece en la carpeta actual a la que estamos accediendo, scontiene una lista de directorios dentro ry fcontendrá una lista de archivos en esa carpeta. Por supuesto, si fy sestán vacíos, sabemos que restá vacío.
  • La primera lista de comprensión nos permite crear empty, la lista de todos los directorios que están vacíos, en base a la evaluación indicada anteriormente.
  • segunda función, map()se utiliza para realizar os.rmdir()en cada elemento de la emptylista. La comprensión de la lista podría usarse como alternativa.

Como guión, esto sería así:

#!/usr/bin/env python
import os
empty=[]
for r,s,f in os.walk("."):
    if not f and not s and r != ".":
        empty.append(r)

for i in empty:
    os.rmdir(i)
Sergiy Kolodyazhnyy
fuente
demasiado complicado para preguntas simples :(
nurulhudamustaqim
@nurulhudamustaqim Depende del punto de vista. Para muchos usuarios de Linux que están acostumbrados a Python, esto es realmente muy modesto :) Y además de su variedad. La administración del sistema moderno no se limita a bash o /bin/shsolo y Python es en realidad un lenguaje más elegante que esos dos
Sergiy Kolodyazhnyy