Điểm:2

Làm thế nào để mã này hoạt động để nén một tập tin?

lá cờ us

Tôi đã đọc dòng mã này:

nén_size_bzip2=$(bzip2 "$file" ; stat -c %s "$file.bz2")

Ai đó có thể giúp tôi hiểu lệnh này và cách tôi có thể viết mã này theo những cách khác không?

James S. avatar
lá cờ de
Đây không phải là một câu hỏi về Ubuntu. Trong tương lai, khi đặt câu hỏi chung về Unix và Linux, bạn nên sử dụng stackexchange đó: https://unix.stackexchange.com/
Điểm:12
lá cờ cn
raj

Hãy phá vỡ lệnh này xuống.

  1. nén_size_bzip2=bất cứ thứ gì đặt giá trị của biến shell được gọi là nén_size_bzip2 (chỉ là một cái tên không có ý nghĩa đặc biệt) để bất cứ điều gì được viết bên tay phải của = dấu hiệu.

  2. Điều đó bất cứ điều gì trong trường hợp của chúng tôi là $(lệnh). Đây là một lệnh thay thế; giá trị của cấu trúc này bằng bất cứ giá trị nào chỉ huy viết ra trong đầu ra.

  3. Các chỉ huy Là: bzip2 "$file" ; thống kê -c %s "$file.bz2", vì vậy trên thực tế, hai lệnh được thực hiện lần lượt. Lệnh đầu tiên, bzip2 "$file" nén tệp có tên được lấy từ biến shell tập tin. Các dấu ngoặc kép ở đó trong trường hợp tên chứa dấu cách. Bình thường lệnh này không viết gì cả. Lệnh thứ hai, thống kê -c %s "$file.bz2", xuất kích thước của tệp có tên là giá trị của biến shell tập tin cộng với phần mở rộng .bz2.

Vì vậy, kích thước đó là đầu ra của toàn bộ chỉ huy, và nó được gán cho biến nén_size_bzip2.

Nếu bạn đặt biến tập tin vào tên tệp bạn muốn nén chẳng hạn tệp = myfile.txt, và sau đó chạy dòng trên, hai điều sẽ xảy ra:

  1. tập tin myfile.txt sẽ được nén vào myfile.txt.bz2
  2. kích thước của tập tin myfile.txt.bz2 sẽ được gán cho biến nén_size_bzip2. Bạn có thể hiển thị giá trị này bằng lệnh tiếng vang $compress_size_bzip2.
Điểm:7
lá cờ in
  1. bzip2 "$file"
    

    Điều này sẽ chạy bzip2 trên tên tệp được lưu trong biến "$file". bzip2 sẽ nén tệp thành một tệp mới có tên $file.bz2.

  2. thống kê -c %s "$file.bz2"
    

    cái này chạy thống kê trên nén mới được tạo $file.bz2:

    Từ chỉ số người đàn ông:

    stat - hiển thị trạng thái tệp hoặc hệ thống tệp
    
        -c --format=ĐỊNH DẠNG
             sử dụng FORMAT được chỉ định thay vì mặc định
        %s tổng kích thước, tính bằng byte
    

    Vì vậy, điều này thống kê lệnh sẽ trả về kích thước tệp theo byte của tệp mới.

  3. $(một số_lệnh)
    

    cái này gọi là lệnh thay thế

    Bash thực hiện việc mở rộng bằng cách thực thi lệnh trong môi trường lớp con và thay thế lệnh thay thế bằng đầu ra tiêu chuẩn của lệnh.

    Cho nên, var=$(some_command) tiết kiệm đầu ra của some_command thành một biến var.


Tổng cộng:

nén_size_bzip2=$(bzip2 "$file" ; stat -c %s "$file.bz2")

cái này chạy bzip2thống kê trong một subshell. Đầu ra của subshell là kích thước của tệp nén tính bằng byte, sẽ được lưu trong một biến $compress_size_bzip2.


Tuy nhiên, có chỗ để cải thiện:

Bạn nên kết hợp các lệnh trong subshell với &&, Vì thế thống kê chỉ chạy khi bzip2 đã thành công.

Nếu bạn không cần một tập tin nén, bạn nên nói bzip2 để nén thành đầu ra tiêu chuẩn với -c gắn cờ và sử dụng wc -c để nói kích thước của nó:

nén_size_bzip2=$(bzip2 -c "$file" | wc -c)
2012rcampion avatar
lá cờ kp
Lệnh cuối cùng không hoạt động; bộ mô tả tệp là một liên kết tượng trưng và `stat` đọc kích thước của chính liên kết tượng trưng đó. (Luôn là 64 byte trên hệ thống của tôi). Bạn có thể thấy điều này bằng cách xóa tùy chọn `-c %s`. Tuy nhiên, ngay cả khi chúng tôi nhận được `stat` để đi theo liên kết với tùy chọn `-L`, thì tệp bên dưới là một fifo nên kích thước chỉ là kích thước hiện được lưu vào bộ đệm; và vì `stat` chạy ngay lập tức nên `bzip2` không có thời gian để viết bất cứ thứ gì và kích thước được báo cáo sẽ bằng không. Thay vào đó, bạn nên sử dụng một cái gì đó như `bzip2 -c "$file" | wc -c`.
pLumo avatar
lá cờ in
Bạn hoàn toàn đúng. Tôi đã thay thế lệnh sai. Cảm ơn cho những người đứng đầu lên.

Đăng câu trả lời

Hầu hết mọi người không hiểu rằng việc đặt nhiều câu hỏi sẽ mở ra cơ hội học hỏi và cải thiện mối quan hệ giữa các cá nhân. Ví dụ, trong các nghiên cứu của Alison, mặc dù mọi người có thể nhớ chính xác có bao nhiêu câu hỏi đã được đặt ra trong các cuộc trò chuyện của họ, nhưng họ không trực giác nhận ra mối liên hệ giữa câu hỏi và sự yêu thích. Qua bốn nghiên cứu, trong đó những người tham gia tự tham gia vào các cuộc trò chuyện hoặc đọc bản ghi lại các cuộc trò chuyện của người khác, mọi người có xu hướng không nhận ra rằng việc đặt câu hỏi sẽ ảnh hưởng—hoặc đã ảnh hưởng—mức độ thân thiện giữa những người đối thoại.