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 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.
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.
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.
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.
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 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.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 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)
/bin/shsolo y Python es en realidad un lenguaje más elegante que esos dos