บรรทัดคำสั่ง: วิธีจัดการช่องว่างในชื่อไฟล์


2

ฉันกำลังวัดขนาดไฟล์ทั้งหมดของพวงซึ่งพา ธ ที่ฉันเก็บไว้ในเอกสารข้อความ files.txt ตัวอย่างเนื้อหาของ files.txt:

file1.txt
file2.txt
file3.txt

คำสั่ง shell นี้ให้ผลลัพธ์ที่ฉันต้องการ:

$ du -hc $(cat files.txt)

นอกเสียจากว่าฉันจะมีชื่อไฟล์ที่มีช่องว่างในนั้นเช่น: file 9.txtจากนั้นdu -hcพยายามแยกชื่อไฟล์ที่ช่องว่าง ไม่ว่าฉันจะใส่ใบเสนอราคาไว้ที่ไหนใน files.txt หรือในคำสั่งเชลล์ของฉัน ฉันควรทำอย่างไรดี

FYI, เอกสารรายการไฟล์ของฉันเป็นผลลัพธ์ของคำสั่งดังนี้:

find ~/Dropbox/ -type f -iname "*.BMP" >> bmpfound.txt

รายละเอียดระบบของฉัน: MacOS ใช้ oh-my-zsh ใน Terminal.app


หากคุณมีความxargsพยายามแต่ตอนนี้อาจจะล้มเหลวด้วยชื่อไฟล์ที่มีcat files.txt|xargs -I{} du -hc "{}" "ปลอดภัยมากขึ้นอาจจะทำในวงwhile read line;do du -hc "$line";done <files.txt
เปาโล

2
ถ้าคุณduใช้เวลาหาเรื่องแล้วใช้ที่และเปลี่ยนการค้นหาของคุณเพื่อเพิ่ม--files0-from -print0
meuh

คำตอบ:


2

ใช้ประโยชน์จาก-print0ตัวเลือกในfindและไพพ์ไปที่xargs -0:

find ~/Dropbox/ -type f -iname "*.BMP" -print0 | xargs -0 du -ch

อีกวิธีหนึ่งตามที่ Gordon Davisson แสดงความคิดเห็นสิ่งนี้สามารถทำให้ง่ายขึ้น:

find ~/Dropbox/ -type f -iname "*.BMP" -exec du -ch {} +

อย่างใดอย่างหนึ่งเหล่านี้ควรทำงานกับชื่อไฟล์ที่มีช่องว่างหรือลักษณะของตัวละครโง่ ๆ สำหรับเรื่องนั้น

ฉันไม่แน่ใจว่าคุณตั้งใจจะเปลี่ยนเส้นทางfindเอาต์พุตไปยังไฟล์แทนที่จะไปป์ที่จุดประสงค์นั้นหรือไม่ แต่ถ้าคุณต้องการเก็บรายชื่อไฟล์ไว้รอบ ๆ คุณสามารถทำได้ดังนี้:

xargs -0 du -ch < bmpfound.txt

1
หากคุณไม่ต้องการเก็บfindผลลัพธ์ไว้ในไฟล์คุณสามารถทำให้มันง่ายขึ้นด้วยfind ~/Dropbox/ -type f -iname "*.BMP" -exec du -ch {} +
Gordon Davisson

@GordonDavisson ยอดเยี่ยม! ตอนแรกฉันได้ลองใช้-exec duเส้นทาง แต่ก็พลาด+ไวยากรณ์ไปอย่างสิ้นเชิง มันมีประโยชน์มาก
ZeroKnight
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.