Lệnh du trong Linux

dudf là  2 lệnh được dùng phổ biến nhất trong Linux để thực hiện việc tính toán kích thước tập tin, thư mục và không gian đĩa. Trong đó:

  • du – disk usage:  báo cáo lượng không gian trên đĩa được dùng bởi 1 các tập tin và thư mục.
  • df – disk free: báo cáo lượng không gian lưu trữ còn trống trên đĩa.

Trong bài viết này, chúng ta sẽ tìm hiểu qua cách sử dụng lệnh du trong Linux để thực hiện việc tính toán dung lượng tập tin, thư mục.

1. Cú pháp

Cú pháp lệnh du như sau:

$ du [OPTION]… [FILE]…

Ví dụ:

$ du text.txt
4    text.txt

Khi không có đối số, du sẽ báo cáo không gian đĩa cho thư mục hiện tại.

Bình thường, đơn vị mặc định của du là 1024 byte. Như trong ví dụ trên, tập tin text.txt của chúng ta có độ lớn là 4*1024 = 4096 byte ( 4 KB). Chúng ta có thể thay đổi giá trị đơn vị này. Khi kết quả là các số khác số nguyên, nó sẽ được làm tròn lên số nguyên tiếp theo. Ví dụ nếu kích thước của tập tin là 131,2 KB thì du sẽ xuất ra giá trị là 132 KB.

Nếu có 2 hoặc nhiều liên kết cứng trỏ đến cùng 1 tập tin, chỉ 1 trong các liên kết này được tính. Thứ tự đối số FILE ảnh hưởng đến những liên kết được tính, và việc thay đổi thứ tự đối số có thể thay đổi kết quả mà du xuất ra.

2. In ra kích thước thật của tập tin

Để in ra kích thước thật của tập tin thay cho kích thước trên đĩa, sử dụng tùy chọn –apparent-size trong du như sau:

$ du --apparent-size FILE

Kích thước thật sự của 1 tập tin là số byte được trả về bởi lệnh

$ wc –c FILE

trên các tập tin thông thường.

Tổng quát hơn là các lệnh:

$ ls -l --block-size=1 FILE
$ stat --format=%s FILE

Ví dụ:

$ ls -l --block-size=1 du.txt
-rw-r--r-- 1 root root 8518 Feb  3 13:30 du.txt
$ du du.txt
12    du.txt
$ du --apparent-size du.txt
9    du.txt

Tuy nhiên, với 1 tập tin được tạo bởi lệnh sau:

$ dd bs=1 seek=2GiB if=/dev/null of=big

Tập tin trên có kích thước thật là 2 GB.

$ stat --format=%s big
2147483648

Nhưng trên hầu hết các hệ thống hiện tại, nó gần như không sử dụng không gian đĩa.

$ du big
0    big
$ du --apparent-size big
2097152    big

3. Thiết lập đơn vị tính

Đơn vị mặc định của du là 1024 byte. Chúng ta có thể thay đổi giá trị này bằng cách sử dụng tùy chọn -B hay –block-size như sau:

$ du -B SIZE FILE

hoặc

$ du --block-size=SIZE FILE

Trong đó, SIZE có thể (hoặc là 1 số nguyên theo sau bởi) 1 trong các giá trị sau:

  • KB => 1000 byte
  • K => 1024 byte
  • MB => 1000*1000 byte
  • M=> 1024*1024 byte
  • và cứ thế cho các giá trị G (Gigabyte), T (Terabyte), P (Petabyte), E (Exabyte), Z (Zettabyte), Y (Yottabyte).

Nếu SIZE là 1 số nguyên và không theo sau bởi các hậu tố đã liệt kê ở trên, khi đó đơn vị tính sẽ là byte.

Ví dụ:

$ du --apparent-size --block-size=2 file

Đơn vị tính của lệnh trên là 2 byte.

Các tùy chọn khác liên quan đến đơn vị tính của du:

  • -b hoặc –bytes =>  tương tự với –apparent-size –block-size=1
  • -k => tương đương với –apparent-size –block-size=1K
  • -m => tương đương với –apparent-size –block-size=1M

4. Lấy kích thước tập tin bên trong thư mục

Khi sử dụng du với thư mục, du chỉ xuất ra kích thước của thư mục này và các thư mục con bên trong nó, các tập tin bên trong thư mục này sẽ được bỏ qua:

$ tree test
test/
├── dir
│   └── file3
├── file1
└── file2
$  du --apparent-size test
2097156 test/dir
4194313 test/

Để hiển thị dung lượng của tất cả tập tin bên trong thư mục, sử dụng tùy chọn -a hoặc –all như sau:

$ du -a --apparent-size test
2097152    test/dir/file3
2097156    test/dir
1          test/file2
2097152    test/file1
4194313    test/

5. Định dạng dữ liệu xuất ra

Để kết quả xuất ra của du dễ hiểu hơn, chúng ta có thể sử dụng tùy chọn -h hay –human-readable trong du như sau:

$ du --apparent-size -b file.tar.gz
2147483648      file.tar.gz
$ du --apparent-size -h file.tar.gz
2.0G    file.tar.gz

Với:

  • K => tương đương với KB (1024 byte)
  • M => tương đương với MB (1024 KB)
  • G => tương đương với GB (1024 MB)

Tùy chọn này tương được với –block-size=human-readable

du --apparent-size --block-size=human-readable file.tar.gz
2.0G    file.tar.gz

Ngoài ra, còn có 1 tùy chọn khác là –si, khi sử dụng tùy chọn này thì:

  • 1 KB = 1000 byte
  • 1 MB = 1000*1000 byte
  • … và cứ thế
$ du --apparent-size --si file.tar.gz
2.2G    file.tar.gz

Tùy chọn này tương đương với –block-size=si

du --apparent-size --block-size=si file.tar.gz
2.2G    file.tar.gz

Để lấy kích thước tổng của 1 đối số, thay cho việc in ra kích thước của từng tập tin và thư mục con bên trong, sử dụng tùy chọn -s hay –summarize như sau:

$ du --apparent-size test
2097156 test/dir
4194313 test
du --apparent-size -s test
4194313 test

Để in ra kích thước tổng của tất cả các đối số, sử dụng tùy chọn -c hoặc –total như sau:

$  du -c -s --apparent-size test1 test2
4194313 test1
2097157 test2
6291469 total

6. Làm việc với các liên kết

Thỉnh thoảng, chúng ta sẽ gặp trường hợp trong thư mục của chúng ta có chứa các liên kết (cứng hoặc mềm) trỏ đến các tập tin hoặc thư mục khác. Trong những trường hợp như vậy, việc tính toán kích thước của thư mục sẽ có 2 cách như sau:

  • Lấy kích thước của chính liên kết đó trong thư mục.
  • Đi đến tập tin hoặc thư mục mà liên kết đó trỏ đến, lấy kích thước của tập tin hay thư mục đó.

Với cách 1:

Để lấy kích thước của 1 địa chỉ liên kết, sử dụng tùy chọn -P hoặc –no-dereference, với mỗi liên kết mềm, du sẽ lấy ra kích thước của chính liên kết mềm đó.

Với cách 2:

Với tùy chọn -L hoặc –deference, du sẽ đến các liên kết mềm mà nó gặp phải, tính toán và hiển thị kích thước được dùng bởi các tập tin hay thư mục mà liên kết trỏ đến, thay vì kích thước của liên kết này.

Ngoài ra, chúng ta cũng có thể sử dụng tùy chọn -D hoặc –dereference-args để thực hiện việc trên, điểm khác nhau là với tùy chọn này, du chỉ đến các liên kết mềm được liệt kê trong các đối số của dòng lệnh du, các liên kết không được liệt kê trong các đối số này sẽ được bỏ qua. Tùy chọn này tương đương với tùy chọn -H.

7. Thời gian trong du

Để hiển thị thời gian trong du, sử dụng tùy chọn –time như sau:

du --apparent-size --time file
2097152        2015-02-04 14:50        file

Lệnh trên sẽ hiển thị thời gian cập nhật gần nhất của tập tin.

1 tập tin sẽ có nhiều thông tin về thời gian như thời gian cập nhật, thời gian truy cập gần nhất …., để hiển thị các loại thời gian này, ta sử dụng các giá trị tương ứng của tùy chọn –time như sau:

  • –time => thời gian cập nhật gần nhất của tập tin.
  • –time=status hoặc –time=use => thời gian thay đổi trạng thái gần nhất của tập tin.
  • –time=access => thời gian truy cập gần nhất của tập tin.

Để định dạng các loại thời gian trên, sử dụng tùy chọn –time-style như sau:

--time-style=STYLE

Trong đó, STYLE là 1 trong các giá trị sau:

  • +FORMAT => định dạng thời gian theo FORMAT mà chúng ta quy định.

Ví dụ:

--time-style="+%Y-%m-%d %H:%M:%S"
2002-03-30 23:45:56
  • full-iso => định dạng thời gian đầy đủ với ngày tháng, thời gian và time zone tính theo nano giây

Ví dụ:

--time-style=full-iso
2002-03-30 23:45:56.477817180 -0700
  • long-iso => định dạng thời gian với ngày tháng và thời gian tính theo phút.

Ví dụ:

--time-style=long-iso
2002-03-30 23:45
  • iso => định dạng thời gian theo ngày tháng.

Ví dụ:

--time-style=iso
2002-03-30

Chúng ta có thể chỉ định giá trị mặc định cho tùy chon –time-style với biến môi trường TIME_STYLE. Nếu TIME_STYLE không được thiết lập, kiểu mặc định là long-iso. Để tương thích với lệnh ls, nếu TIME_STYLE bắt đầu với ‘+’ và chứa 1 ký tự dòng mới, thì ký tự dòng mới và bất kỳ ký tự sau đó được bỏ qua; nếu TIME_STYLE bắt đầu với ‘posix-‘, thì ‘posix-‘ bị bỏ qua; nếu TIME_STYLE là ‘locale’, nó được bỏ qua.

8. Bỏ qua các tập tin

Trong quá trình tính toán kích thước của 1 thư mục, sẽ có lúc chúng ta muốn bỏ qua 1 số tập tin hay thư mục con bên trong thư mục cần lấy kích thước, trong những trường hợp như vậy, chúng ta có thể sử dụng những cách sau:

  • Để bỏ qua các tập tin có tên khớp với 1 mẫu nào đó, chúng ta sử dụng tùy chọn –exclude như sau:
--exclude=PATTERN

Ví dụ:

$ du --exclude='*.o'

Lệnh trên sẽ bỏ qua các tập tin và thư mục có tên kết thúc là .o

  • Thay cho việc sử dụng mẫu để lọc ra danh sách tập tin và thư mục cần loại bỏ như ở trên, chúng ta có thể yêu cầu du bỏ qua những tập tin và thư mục được liệt kê bên trong 1 tập tin, bằng cách sử dụng tùy chọn -X hoặc –exclude-from như sau:
-X FILE
--exclude-from=FILE

Trong đó FILE là tập tin chứa danh sách cần loại bỏ, với tên của mỗi tập tin và thư mục nằm trên 1 dòng riêng.

Ví dụ:

$ tree test
test/
├── dir
│   └── file3
├── file1
└── file2
$ cat list.txt
file3
$  du -a --apparent-size -X list.txt test
4 test/dir
1 test/file2
2097152 test/file1
2097161 test
  • Ngoài ra, còn có 1 tùy chọn khác là -x hoặc –one-file-system, với tùy chọn này, du sẽ bỏ qua các thư mục và tập tin trên các hệ thống tập tin khác.

9. Lấy danh sách đối số từ tập tin

Để lấy danh sách các đối sô từ 1 tập tin, chúng ta sử dụng tùy chọn –files0-from như sau:

--files0-from=FILE

Mỗi tên đối số trong FILE được phân biệt bởi byte 0 (ký tự NULL).

Việc này có ích khi chúng ta có 1 danh sách tên tập tin dài đến mức nó có thể vượt qua giới hạn chiều dài của dòng lệnh. Trong những trường hợp như vậy, việc sử dụng du với xargs không lý tưởng vì nó chia danh sách của chúng ta ra nhiều phần và làm cho tùy chọn –total hay -c của du cho kết quả không chính xác.

Chúng ta kết thúc bài tìm hiểu về lệnh du trong Linux tại đây. Chúc các bạn thành công!

Leave a Reply

This site uses Akismet to reduce spam. Learn how your comment data is processed.