Est-ce que j'ai râté quelque chose. Toutes ces regex et/ou boucles ne sont sûrement pas nécessaires, une ligne fera l'affaire. De plus, les solutions "for foo in $()" échoueront s'il y a des espaces dans les noms de chemin.
Utilisez simplement dirname deux fois avec xargs, pour obtenir le parent du parent...
# 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 {}
Produit
./hht
./wee1
Vous pouvez le faire facilement avec les options de formatage du -printf
action de find
(voir man find
).
cd /nfs//office/ && find . -name '.user.log' -printf "%h\n"
./hht/info
./wee1/info
À partir de la page de manuel :
%h\n
imprimera le chemin de chaque fichier sur une nouvelle ligne.
Veuillez noter que -printf
est GNU uniquement. Cela ne fonctionnera pas sur macOS (un système BSD).
for file in $(find /nfs/office -name .user.log -print)
do
parent=$(dirname $(dirname $file))
echo $parent
done
EDIT :Désolé, vous avez manqué le répertoire des grands-parents.