Me estoy perdiendo de algo. Seguramente todas estas expresiones regulares y/o bucles no son necesarios, una sola línea hará el trabajo. Además, las soluciones "for foo in $()" fallarán cuando haya espacios en los nombres de las rutas.
Simplemente use dirname dos veces con xargs, para obtener el padre del padre...
# make test case
mkdir -p /nfs/office/hht/info
mkdir -p /nfs/office/wee1/info
touch /nfs/office/hht/info/.user.log
touch /nfs/office/wee1/info/.user.log
# parent's parent approach
cd /nfs//office/ && find . -name '.user.log' | xargs -I{} dirname {} | xargs -I{} dirname {}
# alternative, have find print parent directory, so dirname only needed once...
cd /nfs//office/ && find . -name ".user.log" -printf "%h\n" | xargs -I{} dirname {}
Produce
./hht
./wee1
Puede hacerlo fácilmente con las opciones de formato del -printf
acción de find
(ver man find
).
cd /nfs//office/ && find . -name '.user.log' -printf "%h\n"
./hht/info
./wee1/info
Desde la página del manual:
%h\n
imprimirá la ruta de cada archivo en una nueva línea.
Tenga en cuenta que -printf
es solo GNU. No funcionará en macOS (un sistema BSD).
for file in $(find /nfs/office -name .user.log -print)
do
parent=$(dirname $(dirname $file))
echo $parent
done
EDITAR:Lamento no haber querido el directorio de abuelos.