linux - directories - tree redhat
BASH: solo imprime el directorio más profundo en la ruta (2)
Necesito algo de ayuda.....
En mi archivo .bashrc tengo una función MUY útil (puede ser un poco áspero y listo, y un poco raro, pero funciona como un regalo!) Que lee un archivo de entrada, y utiliza la función ''árbol'' en cada uno de los líneas de entrada para crear un árbol de directorios. este árbol se imprime en un archivo de salida (junto con el tamaño de la carpeta).
multitree()
{
while read cheese
do
pushd . > /dev/null
pushd $cheese > /dev/null
echo -e "$cheese /n/n" >> ~/Desktop/$2.txt
tree -idf . >> ~/Desktop/$2.txt
echo -e "/n/n/n" >> ~/Desktop/$2.txt
du -sh --si >> ~/Desktop/$2.txt
echo -e "/n/n/n/n/n/n/n" >> ~/Desktop/$2.txt
popd > /dev/null
done < $1
cat ~/done
}
Este es un ahorro de tiempo como sin fin, y muestra un fragmento como el siguiente:
./foo
./foo/bar
./foo/bar/1
./foo/bar/1/2
etcétera etcétera....
sin embargo, la primera (y más tediosa) cosa que necesito hacer es eliminar todas las entradas, dejando solo la ruta más profunda de la carpeta (usando el ejemplo anterior, se reduciría a solo ./foo/bar/1/2)
¿Hay alguna forma de procesar el archivo antes / después de la función de árbol para imprimir solo los niveles más profundos?
Sé que algo así como Python podría hacer un mejor trabajo, pero mi problema es que nunca he usado Python. Y no estoy seguro de que los sistemas de trabajo me permitan ejecutar python ... nos permiten modificar nuestro propio .bashrc, así que estoy no muy preocupado!
Gracias de antemano chicos !!!!
Owen.
Aquí hay una pista:
Solo necesita contar la cantidad de caracteres "/" en cada línea.
Si la línea actual tiene menos que el número de caracteres "/" en la línea anterior, la línea anterior sería el directorio "más profundo" en su parte de la jerarquía.
Esta línea, y cualquier línea subsiguiente con menos caracteres "/" NO sería el directorio más profundo en su parte de la jerarquía de directorios completa. Tan pronto como obtenga una línea con el mismo número de caracteres "/", o mayor, podrá "reiniciar" y, una vez más, estar atento a la primera línea con menos caracteres "/".
Y, finalmente, necesita manejar el caso trivial: solo una línea en la salida de su árbol, el directorio actual no tiene subdirectorios, por lo que gana por defecto.
Otra forma en que puede implementar esto es considerando la siguiente declaración:
Si el nombre de un directorio también existe como un prefijo exacto de otro directorio en la lista, seguido por el carácter "/", entonces NO es el directorio más profundo en su parte de la jerarquía.
Podrías usar
find . -type d -links 2
Reemplazar con un directorio si lo deseas.
EDITAR: Explicación:
find
busca en un directorio los archivos que coinciden con un filtro dado. En este caso, el directorio es .
, y el filtro es -type d -links 2
.
-type d
filtros para directorios
-links 2
filtros para aquellos que tienen dos enlaces (duros) a su nombre. Efectivamente, esto filtra para todos los directorios que no tienen subdirectorios, porque solo aquellos tienen dos: el que está en su directorio padre y el .
enlace en sí mismos. Aquellos con subdirectorios también tienen los enlaces ..
en sus subdirectorios.