หากคุณใช้ GNU find
คุณสามารถลองใช้-execdir
พารามิเตอร์ได้เช่น:
find . -type d -execdir realpath "{}" ';'
หรือ (ตามความคิดเห็น @gniourf_gniourf ):
find . -type d -execdir sh -c 'printf "%s/%s\n" "$PWD" "$0"' {} \;
หมายเหตุ: คุณสามารถใช้${0#./}
แทน$0
การแก้ไข./
ด้านหน้า
หรือตัวอย่างที่ใช้งานได้จริง:
find . -name .git -type d -execdir git pull -v ';'
หากคุณต้องการที่จะรวมไดเรกทอรีปัจจุบันมันง่ายยิ่งขึ้นโดยใช้-exec
:
find . -type d -exec sh -c 'cd -P -- "{}" && pwd -P' \;
หรือใช้xargs
:
find . -type d -print0 | xargs -0 -L1 sh -c 'cd "$0" && pwd && echo Do stuff'
หรือตัวอย่างที่คล้ายกันที่แนะนำโดย@gniourf_gniourf :
find . -type d -print0 | while IFS= read -r -d '' file; do
# ...
done
ตัวอย่างข้างต้นสนับสนุนไดเรกทอรีที่มีช่องว่างในชื่อ
หรือโดยการกำหนดให้เป็นอาร์เรย์ทุบตี:
dirs=($(find . -type d))
for dir in "${dirs[@]}"; do
cd "$dir"
echo $PWD
done
เปลี่ยน.
เป็นชื่อโฟลเดอร์เฉพาะของคุณ หากคุณไม่จำเป็นต้องเรียกใช้ซ้ำคุณสามารถใช้: dirs=(*)
แทน ตัวอย่างข้างต้นไม่รองรับไดเรกทอรีที่มีช่องว่างในชื่อ
ดังนั้นตามที่@gniourf_gniourfแนะนำวิธีการที่เหมาะสมเท่านั้นที่จะนำเอาท์พุทการค้นหาในอาเรย์โดยไม่ต้องใช้ลูปที่ชัดเจนจะมีอยู่ใน Bash 4.4 ด้วย:
mapfile -t -d '' dirs < <(find . -type d -print0)
หรือไม่ใช่วิธีที่แนะนำ (ซึ่งเกี่ยวข้องกับการแยกวิเคราะห์ls
):
ls -d */ | awk '{print $NF}' | xargs -n1 sh -c 'cd $0 && pwd && echo Do stuff'
ตัวอย่างข้างต้นจะไม่สนใจ dir ปัจจุบัน (ตามที่ร้องขอโดย OP) แต่มันจะแตกชื่อด้วยช่องว่าง
ดูสิ่งนี้ด้วย:
cd "$d"
น่าจะดีกว่าถ้ามันถ่ายโอนไปยังสถานการณ์ที่อักขระตัวแทนจะจับคู่ไฟล์ที่มีชื่อมีช่องว่างและ / หรืออักขระเมตาของเชลล์