Übersehe ich hier etwas. Sicherlich sind all diese Regex und/oder Schleifen nicht notwendig, ein Einzeiler wird die Arbeit erledigen. Auch "for foo in $()"-Lösungen schlagen fehl, wenn die Pfadnamen Leerzeichen enthalten.
Verwenden Sie einfach dirname zweimal mit xargs, um den übergeordneten Elternteil zu erhalten ...
# 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 {}
Produziert
./hht
./wee1
Das geht ganz einfach mit den Formatierungsoptionen des -printf
Aktion von find
(siehe man find
).
cd /nfs//office/ && find . -name '.user.log' -printf "%h\n"
./hht/info
./wee1/info
Aus der Manpage:
%h\n
gibt den Pfad für jede Datei in einer neuen Zeile aus.
Bitte beachten Sie, dass -printf
ist nur GNU. Es funktioniert nicht unter macOS (einem BSD-System).
for file in $(find /nfs/office -name .user.log -print)
do
parent=$(dirname $(dirname $file))
echo $parent
done
EDIT:Tut mir leid, dass Sie das Großeltern-Verzeichnis haben möchten.