Digamos que tengo un directorio llamado foo/
. Esta carpeta incluye subdirectorios. ¿Cómo puedo eliminar todos los directorios vacíos en un comando?
Digamos que tengo un directorio llamado foo/
. Esta carpeta incluye subdirectorios. ¿Cómo puedo eliminar todos los directorios vacíos en un comando?
Respuestas:
Prueba este comando:
find . -empty -type d -delete
El find
comando 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 -empty
opción es válida para cualquier archivo y directorio que esté vacío.
La -type d
opción es verdadera para el tipo de archivo especificado; en este caso d
representa el directorio del tipo de archivo .
La -delete
opción es la acción a realizar, y es válida para todos los archivos encontrados en la búsqueda.
rm -rf <directory-name>
. Esto eliminará el directorio, junto con todo su contenido, incluidos archivos y subdirectorios. La -r
opción significa eliminar de forma recursiva, mientras que el -f
comando significa no solicitar antes de eliminar. Sin embargo, si desea que se le solicite antes de eliminar un directorio / archivo, reemplace la -f
opción con la -i
opción.
stdout
comando de un (p find
. Ej. ) Al stdin
otro (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 man
páginas para cada uno de estos comandos. Para estar seguro, siempre pruebe tales cosas en un directorio temporal antes de probar la cosa real.
Puede aprovechar la rmdir
negativa del comando a eliminar directorios no vacíos y la find -depth
opción de recorrer el árbol de directorios de abajo hacia arriba:
find . -depth -exec rmdir {} \;
(e ignorar los errores), o agregar 2>/dev/null
para ignorarlos realmente.
La -depth
opción para find
comenzar a buscar en la parte inferior del árbol de directorios.
rm -rf
eliminará todos los archivos en el directorio (y sus subdirectorios, y ....) Y todos los directorios y todo.
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
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.)
$HOME
. Con una sonrisa malvada.
find . -type d -empty -delete -maxdepth 1
Por si solo desea eliminar los subdirectorios directos de foo/
.
$ 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í:
os.walk()
función para caminar recursivamente el árbol de directorios. En cada iteración r
se establece en la carpeta actual a la que estamos accediendo, s
contiene una lista de directorios dentro r
y f
contendrá una lista de archivos en esa carpeta. Por supuesto, si f
y s
están vacíos, sabemos que r
está vacío.empty
, la lista de todos los directorios que están vacíos, en base a la evaluación indicada anteriormente.map()
se utiliza para realizar os.rmdir()
en cada elemento de la empty
lista. 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)
/bin/sh
solo y Python es en realidad un lenguaje más elegante que esos dos