
He estado intentando durante horas resolver esto pero parece que no puedo hacerlo.
Mi pregunta es: tengo un nombre de archivo fácil y contiene 4 subdirectorios diferentes.
ahora lo que tengo que hacer es eliminar todo lo que hay debajo de foo (incluidos los enlaces físicos) y recuperar todo el espacio en disco de foo.
Intenté eliminar todo el archivo escribiendo.
rm foo/*
pero no elimina los enlaces físicos que se encuentran en los otros subdirectorios.
Luego intenté ver si los inodos coincidentes
encontrar foo -tipo f -ls | clasificar
y esto es lo que obtuve con este comando
este comando no muestra los demás subdirectorios solo foo/
Puede alguien ayudarme. Gracias.
Respuesta1
Si desea eliminar todos los archivos que están vinculados a cualquiera de los archivos encontrados de forma descendente foo
, con las herramientas GNU, puede hacer:
dir=foo
mountpoint=$(df --output=target -- "$dir" | tail -n +2)
awk -v RS='\0' -v ORS='\0' '
ARGIND == 1 {inum[$0]; next}
{i=$0; getline}
i in inum
' <(find -- "$dir" -xdev ! -type d -links +1 -printf '%i\0') \
<(find -- "$mountpoint" -xdev ! -type d -printf '%i\0%p\0') |
xargs -r0 rm -f
rm -rf -- "$dir"
Eso supone GNU df
, GNU awk
, GNU find
y un shell como el shell GNU ( bash
) que admite la sustitución de procesos ( <(...)
).
Eso también supone $dir
que no comienza con -
o no es un find
predicado (como !
, (
...).
Arriba buscamos archivos en todo el sistema de archivos $dir
al que pertenece. Puede reemplazar $mountpoint
solo con el directorio principal de $dir
( .
en este caso) o el otrosubdirectorios( 123 ABC def
aquí) si sabe que todos los enlaces físicos solo están allí.
En el código anterior, registramos los números de inodo de todos los archivos que no son de directorio con un recuento de enlaces mayor que 1 que se encuentran de forma descendente $dir
. Y busque esos números de inodo en todo el sistema de archivos (al menos en secciones que no estén enmascaradas por otros sistemas de archivos y que tenga permisos para atravesar). Los números de inodo son únicos por sistema de archivos, por lo que los usamos -xdev
para asegurarnos de escanear solo el sistema de archivos $dir
en el que se encuentra.
Respuesta2
rm -rf foo
rm
- eliminar archivos o directorios.
-f
ignore archivos y argumentos inexistentes, nunca pregunte.-r
eliminar directorios y sus contenidos de forma recursiva.