Apakah saya kehilangan sesuatu di sini. Tentunya semua regex dan/atau perulangan ini tidak diperlukan, one-liner akan melakukan pekerjaan itu. Solusi "for foo in $()" juga akan gagal jika ada spasi di nama jalur.
Cukup gunakan dirname dua kali dengan xargs, untuk mendapatkan parent's 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 {}
Menghasilkan
./hht
./wee1
Anda dapat melakukannya dengan mudah menggunakan opsi pemformatan dari -printf
tindakan find
(lihat man find
).
cd /nfs//office/ && find . -name '.user.log' -printf "%h\n"
./hht/info
./wee1/info
Dari halaman manual:
%h\n
akan mencetak jalur untuk setiap file pada baris baru.
Harap dicatat bahwa -printf
hanya untuk GNU. Ini tidak akan berfungsi di macOS (sistem BSD).
for file in $(find /nfs/office -name .user.log -print)
do
parent=$(dirname $(dirname $file))
echo $parent
done
EDIT:Maaf ketinggalan bahwa Anda menginginkan direktori induk.