พฤติกรรมของคำสั่ง `du` พร้อมกับ` `-L 'flag


11

ฉันสังเกตเห็นพฤติกรรมแปลก ๆ พร้อมduคำสั่งเมื่อใช้กับ-Lตัวเลือกบรรทัดคำสั่ง

ฉันใช้ Slackware 14 และ Coreutils 8.19

ในการทำให้เกิดพฤติกรรมแปลก ๆ ให้สร้างสองโฟลเดอร์:

mkdir foo
mkdir bar

สร้างไฟล์ภายในหนึ่งในโฟลเดอร์:

perl -e 'print "A"x10000' > foo/text

และ symlink ในโฟลเดอร์อื่น:

ln -s ../foo/text bar/text

ตอนนี้ถ้าคุณพิมพ์:

du -h -L bar

คุณจะได้รับ:

16k bar

เนื่องจาก symlink ถูกยกเลิกการลงทะเบียน แต่ถ้าคุณพิมพ์:

du -h -L *

คุณจะได้รับ:

16K     foo
4.0K    bar

และ symlink จะไม่ถูกยกเลิกการลงทะเบียน ฉันพลาดอะไรไปรึเปล่า?


ดูเหมือนว่าduต้องการเล่นที่นี่อย่างชาญฉลาด แต่ถ้าคุณเรียกใช้df -a -L bar fooเอาต์พุตนั้นผิดมาก (การนับ 16K ในบาร์ปล่อยให้ foo ว่างเปล่า)
guido

คำตอบ:


18

ตามค่าเริ่มต้นduจะนับแต่ละไฟล์เพียงครั้งเดียวหากมีการเชื่อมโยงกับหลาย ๆ ครั้ง หากคุณเรียกใช้du -L barมันจะนับไฟล์เพราะมันมาถึงเพียงครั้งเดียว อย่างไรก็ตามหากคุณเรียกใช้du -L *จะนับเฉพาะในครั้งแรกที่เห็น ตัวอย่างเช่น:

$ du -L foo bar
16K     foo
4.0K    bar

$ du -L bar foo
16K     bar
4.0K    foo

โปรดสังเกตว่าการสลับลำดับของการขัดแย้งจะเปลี่ยนว่าโฟลเดอร์ใดได้รับรายงานว่าเป็น 16K

คุณสามารถบังคับduให้นับไฟล์สองครั้งโดยส่ง-lพารามิเตอร์

แก้ไข:

ลิงก์สัญลักษณ์เป็นไฟล์ชนิดพิเศษและจำเป็นต้องมีขั้นตอนเพิ่มเติมในการติดตามลิงก์ duจะไม่ติดตามลิงก์สัญลักษณ์ยกเว้นว่า-Lจะเปิดใช้งานตัวเลือก

ฮาร์ดลิงก์ในอีกทางหนึ่งโดยทั่วไปจะมีไฟล์หนึ่งไฟล์ที่มีอยู่ในสองโฟลเดอร์ (หรือมากกว่า) duสันนิษฐานว่าติดตามว่าไฟล์ใดที่มีหมายเลขไอโหนดเห็นเพื่อหลีกเลี่ยงการนับสองครั้ง -lปิดใช้งานพฤติกรรมนี้

ดังนั้นเพียงแค่-Lมันจะไปตามลิงก์สัญลักษณ์ แต่หากไฟล์เป้าหมายมีหมายเลขไอโหนดจะเห็นว่ามันจะไม่ถูกนับใหม่ เพียงแค่-lมันจะนับการเชื่อมโยงฮาร์ดที่ซ้ำกัน แต่จะไม่ติดตามลิงก์สัญลักษณ์

หากคุณใช้-lและ-Lร่วมกันทั้งคู่จะติดตามลิงก์สัญลักษณ์และอนุญาตให้นับไฟล์เป้าหมายมากกว่าหนึ่งครั้ง


ขอขอบคุณ. วิธีนี้ใช้ได้ผล อย่างไรก็ตามฉันชอบที่จะอธิบายเพิ่มเติม ในหน้าคนฉันอ่านมัน-lทำcount sizes many times if hard linkedแต่ที่นี่ฉันกำลังทำงานกับ symlink ยิ่งไปกว่านั้น-lคนเดียวไม่สามารถแก้ปัญหาได้ในขณะที่ถ้าฉันใช้ทั้งคู่-lและ-Lนับขนาดได้อย่างเหมาะสม
Zagorax

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