ฉันต้องการทำบางสิ่งซ้ำ ๆ ในรายการไฟล์ ไฟล์ในคำถามมีช่องว่างในชื่อของพวกเขา:
david@david: ls -l
total 32
-rw-rw-r-- 1 david david 13 Mai 8 11:55 haha
-rw-rw-r-- 1 david david 0 Mai 8 11:55 haha~
-rw-rw-r-- 1 david david 13 Mai 8 11:55 haha (3rd copy)
-rw-rw-r-- 1 david david 13 Mai 8 11:55 haha (4th copy)
-rw-rw-r-- 1 david david 13 Mai 8 11:55 haha (5th copy)
-rw-rw-r-- 1 david david 13 Mai 8 11:55 haha (6th copy)
-rw-rw-r-- 1 david david 13 Mai 8 11:55 haha (7th copy)
-rw-rw-r-- 1 david david 13 Mai 8 11:55 haha (another copy)
-rw-rw-r-- 1 david david 13 Mai 8 11:55 haha (copy)
ตอนนี้ฉันต้องการสร้างไฟล์แต่ละไฟล์เหล่านี้:
david@david: echo '
for file in $(ls)
do
stat $file
done' | bash
(ฉันใช้ echo และ pipe เพื่อเขียนคำสั่งหลายบรรทัด)
เมื่อฉันทำเช่นนั้นจะทำงานอย่างถูกต้องในไฟล์เหล่านั้นที่ไม่มีช่องว่างในชื่อของพวกเขา แต่คนอื่น ๆ ...
stat: cannot stat ‘(another’: No such file or directory
stat: cannot stat ‘copy)’: No such file or directory
เปลี่ยน$(ls)
ไป"$(ls)"
หรือ$file
จะ"$file"
ไม่ทำงาน ฉันจะทำอย่างไร
แก้ไข:
echo '
for files in *
do
stat "$files"
done' | bash
หลอกลวง! ในขณะที่ฉันยังใหม่อยู่ในการทุบตีฉันต้องการให้สิ่งต่าง ๆ เรียบง่ายที่สุดเท่าที่จะเป็นไปได้ดังนั้นจึงไม่มีอะไรที่จะพยายามหลีกเลี่ยงช่องว่างหรือใช้xargs
หรือวิธีแก้ปัญหาด้วยread -r
แม้ว่าพวกเขาจะแก้ปัญหาได้ก็ตาม
ตามที่บางคนถาม: ใช่การใช้สิ่งนี้แทนที่จะstat *
เป็นเรื่องแปลก แต่ฉันแค่ต้องการหาวิธีทั่วไปในการใช้คำสั่งเดียวกันกับชื่อไฟล์เป็นกลุ่มใน bash โดยใช้ for for loop ดังนั้นstat
สามารถยืนสำหรับgzip
, หรือgpg
rm
stat *
อะไรขึ้น (;-)