รับขนาดไฟล์ทั้งหมดจากไฟล์ที่มีรายการไฟล์


14

ฉันมีไฟล์ที่มีรายการไฟล์ที่ฉันต้องการทราบขนาดไฟล์ทั้งหมด มีคำสั่งให้ทำหรือไม่?

ระบบปฏิบัติการของฉันเป็นลินุกซ์พื้นฐานมาก (Qnap TS-410)

แก้ไข:

ไม่กี่บรรทัดจากไฟล์:

/ share / เก็บถาวร / ทดสอบ Bailey / BD006 / 0.tga
/ หุ้น / เก็บถาวร / Bailey / BD007 / 1 รุ่น 1.tga
/ share / เก็บถาวร / Bailey 2 / BD007 / example.tga


ส่งตัวอย่างบรรทัดของไฟล์มาให้เรา
EEAA

ตัวอย่างจากไฟล์ที่เพิ่ม
Nicolas

นั่นคือ NAS บางประเภทใช่มั้ย คุณติดตั้ง busybox แล้วหรือยัง?
cjc

ใช่แล้วและฉันคิดว่าติดตั้งแล้วทำไม
Nicolas

คำตอบ:


13

ฉันเชื่อว่าสิ่งนี้จะทำงานใน busybox:

du `cat filelist.txt` | awk '{i+=$1} END {print i}'

ฉันไม่ได้มีสภาพแวดล้อมแบบเดียวกันกับคุณ แต่หากคุณพบปัญหาเกี่ยวกับช่องว่างในชื่อไฟล์บางอย่างเช่นนี้ก็ใช้ได้เช่นกัน:

cat filelist.txt | while read file;do
  du "$file"
done | awk '{i+=$1} END {print i}'

แก้ไข 1 :
@stew ถูกต้องในโพสต์ของเขาด้านล่าง, du แสดงการใช้งานดิสก์และไม่ใช่ขนาดที่แน่นอน. ในการเปลี่ยนพฤติกรรม busybox ใช้แฟล็ก -a ดังนั้นให้ลอง: du -a "$file"หาขนาดไฟล์ที่แน่นอนและเปรียบเทียบผลลัพธ์ / พฤติกรรม


1
ขอบคุณสำหรับอินพุตของคุณคำสั่งแรกส่งคืน/usr/bin/du: Argument list too long(เกือบ 80,000 บรรทัดในไฟล์ของฉัน) คำสั่งที่สองของคุณให้ฉันทันทีเมื่อฉันกด Enter รออะไรอีกมั้ย
Nicolas

ยากที่จะพูดกับสภาพแวดล้อมของคุณ มันเป็นพรอมต์คำสั่งปกติหรือเพียงแค่พรอมต์กะพริบ? หากหลังมันอาจช้ารอผลลัพธ์ถ้าเป็น "พร้อมท์อินพุต" อาจเป็นเพราะคุณพลาดอักขระบางตัว? และถ้าเป็นพรอมต์ปกติที่ฉันไม่รู้ฉันจะทดสอบมันอย่างถี่ถ้วนก่อนที่ฉันจะพิมพ์ :(
Mattias Ahnberg

มันเป็น "การป้อนข้อมูลให้" cat tgafiles.txt | while read file;do du "$file" done | awk '{i+=$1} END {print i}'เมื่อฉันทำดังต่อไปนี้ Thanks mattias
Nicolas

1
อา! หากคุณใส่ทุกอย่างลงในบรรทัดเดียว ดังนี้: cat tgafiles.txt | while read file;do du "$file";done | awk '{i+=$1} END {print i}'(เช่นก่อนทำ)
Mattias Ahnberg

จับได้เห็นชัดตรงเผง! มันทำงานได้อย่างสมบูรณ์แบบไชโย! (แม้ว่าฉันจะสามารถหาข้อผิดพลาดนี้ได้ด้วยตัวเอง)
Nicolas

8
du -c `cat filelist.txt` | tail -1 | cut -f 1

-cเพิ่มบรรทัด "ขนาดรวม";
tail -1ใช้บรรทัดสุดท้าย (ขนาดรวม);
cut -f 1ตัดคำว่า "ทั้งหมด" ออก


สิ่งนี้ล้มเหลวด้วยรายการอาร์กิวเมนต์ที่ยาวเกินไป filelist ของฉันใหญ่ คำตอบด้านล่างที่มี xargs น่าจะเป็นทางออกที่ง่ายที่สุด
Syclone0044

4

ฉันไม่รู้ว่าเครื่องมือ linux ของคุณมีความสามารถหรือไม่ แต่:

cat /tmp/filelist.txt  |xargs -d \\n du -c

เช่นนั้น xargs จะตั้งค่าตัวคั่นให้เป็นอักขระขึ้นบรรทัดใหม่และ du จะสร้างผลรวมทั้งหมดสำหรับคุณ

ดูที่http://busybox.net/downloads/BusyBox.htmlดูเหมือนว่า "busybox du" จะรองรับตัวเลือกทั้งหมด แต่ "busybox xargs" จะไม่สนับสนุนตัวคั่นที่กำหนดเอง

อีกครั้งฉันไม่แน่ใจเกี่ยวกับชุดเครื่องมือของคุณ


นี่คือผลลัพธ์:xargs: invalid option -- d
Nicolas

ยอดเยี่ยม: การทำงานกับ linux busybox ของ NAS นั้นเหมือนกับตอน McGuyver พยายามสร้างเครื่องบินที่ใช้งานได้จากผืนผ้าใบแท่งและเส้นใหญ่
cjc

ถ้าคุณมีพื้นที่สำหรับมันบนเครื่องที่แตกต่างกันให้คัดลอกไฟล์ทั้งหมดที่คุณสนใจให้กับ linux อื่นที่ใช้งานได้อย่างสมบูรณ์แล้วเรียกใช้โซลูชันของ Stew ที่นั่น การทำเช่นนั้นอาจจะง่ายกว่าการลองคิดดูว่า busybox สามารถทำสิ่งนี้ได้
cjc

1
ฉันคิดว่าคำตอบที่ดีที่สุด มันกระชับและเร็วกว่าคำตอบอื่น ๆ ในชุดข้อความนี้
zymhan

คำตอบที่ดี. คุณอาจต้องการออกไป-cเพราะ xargs จะทำการโทรหลายครั้งduถ้าตัวกรองไฟล์นั้นยาวพอทำให้เกิดduผลรวมได้หลายตัว
qwr

4
while read filename ;  do stat -c '%s' $filename ; done < filelist.txt | awk '{total+=$1} END {print total}'

สิ่งนี้คล้ายกับโซลูชันของ Mattias Ahnberg การใช้ "อ่าน" จะช่วยแก้ปัญหาเกี่ยวกับชื่อไฟล์ / ไดเรกทอรีที่มีช่องว่าง ฉันใช้statแทนduการรับขนาดไฟล์ คุณได้รับจำนวนห้องที่ใช้งานอยู่บนดิสก์แทนที่จะเป็นขนาดไฟล์ซึ่งอาจแตกต่างกัน ขึ้นอยู่กับระบบไฟล์ของคุณไฟล์ 1 ไบต์จะยังคงมีขนาด 4k บนดิสก์ (หรือขนาดบล็อกคืออะไร) ดังนั้นสำหรับไฟล์ 1 ไบต์สถิติจะบอกว่า 1 ไบต์และ du บอกว่า 4k


ความคิดเห็นที่ดีเกี่ยวกับขนาดไฟล์และขนาดดิสก์!
Mattias Ahnberg

มากความคิดเห็นที่น่าสนใจจริง ๆ น่าเสียดายที่ลินุกซ์ของฉันไม่ทราบstatคำสั่ง:stat: command not found
นิโคลัส

คุณอาจต้องพูดว่า "busybox stat"
cjc

มันบอกว่าstat: applet not foundในกรณีนี้
Nicolas

4

นี่คือวิธีแก้ไขปัญหาอื่น:

cat filelist.txt | tr '\n' '\0' | wc -c --files0-from=-

สำหรับฉัน (บน cygwin) du -bcทำงานได้เร็วขึ้นมาก
qwr

2

ลองสิ่งนี้:

$ cat filelist.txt | xargs ls -l | awk '{x+=$5} END {print "total bytes: " x}' 

ในการจัดการช่องว่างในพา ธ อย่างถูกต้อง:

$ find /path/to/files -type f -print0 | xargs -0 ls -l | awk '{x+=$5} END {print "total bytes: " x}' 

ขอบคุณสำหรับการป้อนข้อมูลของคุณน่าเสียดายที่ฉันคิดว่ามีปัญหากับช่องว่างในไดเรกทอรีภายในไฟล์ของฉันที่ไม่ได้รับการยกเว้นด้วย "\" ดังนั้นมันจะหยุดพักเมื่อผ่านรายการไฟล์
Nicolas

คุณสามารถข้ามรายการไฟล์ข้อความและสร้างออกจาก ouput ได้findหรือไม่
EEAA

โชคไม่ดีที่รายการยาวเกินไปมี 79159 บรรทัดของไฟล์ (พา ธ เต็ม) นั่นคือสาเหตุที่ฉันเอาท์พุทมันไปยังไฟล์ บางทีฉันสามารถเพิ่มข้อโต้แย้งเกี่ยวกับการหลบหนีผลการค้นหาได้หรือไม่
Nicolas

ไม่มีข้อโต้แย้ง "-print0" กับการค้นหาบนระบบลินุกซ์ของฉัน
นิโคลัส

@ นิโคลัส - นั่นเป็นเพราะมันใช้การไม่ว่างfindของกล่องว่างแทนที่จะเป็นfindไบนารีจริง
EEAA

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