ฉันจะไปเกี่ยวกับการสะท้อนเฉพาะชื่อไฟล์ของไฟล์ได้อย่างไรหากฉันวนซ้ำไดเร็กทอรีด้วย for loop
for filename in /home/user/*
do
echo $filename
done;
จะดึงเส้นทางแบบเต็มพร้อมชื่อไฟล์ ฉันต้องการแค่ชื่อไฟล์
ฉันจะไปเกี่ยวกับการสะท้อนเฉพาะชื่อไฟล์ของไฟล์ได้อย่างไรหากฉันวนซ้ำไดเร็กทอรีด้วย for loop
for filename in /home/user/*
do
echo $filename
done;
จะดึงเส้นทางแบบเต็มพร้อมชื่อไฟล์ ฉันต้องการแค่ชื่อไฟล์
คำตอบ:
หากคุณต้องการbash
โซลูชันดั้งเดิม
for file in /home/user/*; do
echo "${file##*/}"
done
ข้างต้นใช้การขยายพารามิเตอร์ซึ่งเป็นของเชลล์และไม่ต้องการการเรียกใช้ไบนารีภายนอกเช่นbasename
อย่างไรก็ตามฉันขอแนะนำให้ใช้ไฟล์ find
find /home/user -type f -printf "%f\n"
${file##*/}
เป็น"${file##*/}"
เพื่อรองรับชื่อไฟล์ที่มีช่องว่างเช่น "My filename with spaces.txt"
เพียงใช้basename
:
echo `basename "$filename"`
จำเป็นต้องมีเครื่องหมายคำพูดในกรณีที่ $ filename มีช่องว่างเช่น
$()
เหมือนที่ Oli ทำ
/test 1
, เอาท์พุท:basename $(pwd)
test
ทดสอบบน OS X และ Ubuntu Server (14.04) วิธีแก้ปัญหาทุบตีแบบเนทีฟตามที่ @SiegeX แนะนำคือสิ่งที่ใช้ได้ผลสำหรับฉัน
basename "$(pwd)"
แทน
$PWD
แทนการรันคำสั่ง
ใช้basename
:
echo $(basename /foo/bar/stuff)
echo
? basename
พิมพ์ผลลัพธ์แล้ว echo
อาจทำให้ผลลัพธ์ยุ่งเหยิงหากคุณไม่อ้างถึง subshell ตัวอย่าง: echo $(basename path/with\ \ spaces)
พิมพ์ไม่ถูกต้องwith spaces
(เว้นวรรคเดียว)
อีกแนวทางหนึ่งคือการใช้ ls
เมื่ออ่านรายชื่อไฟล์ภายในไดเร็กทอรีเพื่อให้สิ่งที่คุณต้องการคือ "เพียงแค่ชื่อไฟล์ / s" ตรงข้ามกับการอ่านพา ธ ไฟล์แบบเต็มจากนั้นแยกคอมโพเนนต์ "ชื่อไฟล์" ในเนื้อหาของ for loop
ตัวอย่างด้านล่างที่เป็นไปตามต้นฉบับของคุณ:
for filename in $(ls /home/user/)
do
echo $filename
done;
หากคุณเรียกใช้สคริปต์ในไดเร็กทอรีเดียวกับไฟล์มันจะกลายเป็น:
for filename in $(ls)
do
echo $filename
done;
ls
รวม dotfiles ใด ๆ ที่ส่วน*
ขยายมักจะไม่มี นอกจากนี้จะfor f in $(...) ...
ล้มเหลวหากชื่อไฟล์ใด ๆ มีช่องว่างเว้นแต่คุณจะตั้งค่า IFS อาจล้มเหลวหากชื่อไฟล์ใด ๆ มี glob char เว้นแต่คุณจะตั้งค่า -f / -o noglob และขึ้นอยู่กับระบบหรือเชลล์echo
อาจล้มเหลวหากชื่อไฟล์ใด ๆ เป็นยัติภังค์ + ตัวอักษรหรือมีเครื่องหมายแบ็กสแลช OTOH เพียงแค่ls -1 /path/to/dir
พิมพ์ชื่อไฟล์แต่ละชื่อบนบรรทัดได้อย่างน่าเชื่อถือโมดูโลความแตกต่างของ dotfiles