Perilaku perintah `du` dengan bendera` -L`

11

Saya telah memperhatikan perilaku aneh dengan duperintah ketika digunakan dengan -Lopsi baris perintah.

Saya menggunakan Slackware 14 dan Coreutils 8.19.

Untuk mereproduksi perilaku aneh, buat dua folder:

mkdir foo
mkdir bar

Buat file di dalam salah satu folder:

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

Dan symlink di folder lain:

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

Sekarang, jika Anda mengetik:

du -h -L bar

Anda akan mendapatkan:

16k bar

Karena symlink itu dereferenced. Tetapi jika Anda mengetik:

du -h -L *

Anda akan mendapatkan:

16K     foo
4.0K    bar

Dan symlink tidak akan dereferensi. Apakah saya melewatkan sesuatu?

Zagorax
sumber
sepertinya duingin bermain pintar di sini, tetapi jika Anda menjalankan df -a -L bar foooutput sangat salah (menghitung 16K di bar meninggalkan foo kosong).
guido

Jawaban:

18

Secara default, duhanya akan menghitung setiap file sekali jika dikaitkan dengan beberapa kali. Jika Anda menjalankannya du -L barakan menghitung file karena hanya mencapainya sekali. Namun, jika Anda menjalankannya du -L *hanya akan menghitungnya saat pertama kali melihatnya. Sebagai contoh:

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

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

Perhatikan bahwa bertukar urutan argumen mengubah folder mana yang dilaporkan sebagai 16K.

Anda dapat memaksa duuntuk menghitung file dua kali dengan melewati -lparameter.

Edit:

Tautan simbolik adalah jenis file khusus, dan diperlukan langkah ekstra untuk mengikuti tautan tersebut. dutidak akan mengikuti tautan simbolik kecuali -Lopsi diaktifkan.

Tautan keras di sisi lain, pada dasarnya adalah satu file yang ada di dua (atau lebih) folder. dumungkin melacak file mana yang telah dilihatnya dengan nomor inode untuk menghindari penghitungan dua kali ini. -lmenonaktifkan perilaku ini.

Jadi, hanya dengan -Litu, ia akan mengikuti tautan simbolik, tetapi jika file target memiliki nomor inode, ia sudah melihatnya tidak akan dihitung ulang. Hanya dengan -litu akan menghitung duplikat tautan keras, tetapi tidak akan mengikuti tautan simbolis.

Jika Anda menggunakan -ldan -Lbersama - sama, keduanya akan mengikuti tautan simbolik, dan juga memungkinkan penghitungan file target lebih dari satu kali.

David Baggerman
sumber
Terima kasih. Ini bekerja. Namun saya ingin memiliki penjelasan tambahan. Pada halaman manual, saya membaca bahwa -ltidak count sizes many times if hard linked, tetapi di sini saya bekerja dengan symlink. Selain itu, -lsendirian tidak menyelesaikan masalah, sementara jika saya menggunakan keduanya -ldan -Litu menghitung ukuran dengan benar.
Zagorax
@Zororax Ya, halaman manual sedikit tidak jelas tentang bagaimana -ldan -Lberinteraksi. Penjelasannya agak terlalu panjang untuk dikomentari, jadi saya sudah memperbarui jawaban saya.
David Baggerman