Score:2

รหัสนี้ทำงานอย่างไรในการบีบอัดไฟล์

ธง us

ฉันได้อ่านรหัสบรรทัดนี้แล้ว:

compress_size_bzip2=$(bzip2 "$file" ; stat -c %s "$file.bz2")

ใครสามารถช่วยฉันให้เข้าใจคำสั่งนี้และฉันจะเขียนโค้ดนี้ด้วยวิธีอื่นได้อย่างไร

James S. avatar
de flag
นี่ไม่ใช่คำถามเกี่ยวกับ Ubuntu ในอนาคต เมื่อถามคำถามทั่วไปเกี่ยวกับ Unix และ Linux คุณควรใช้ stackexchange นั้น: https://unix.stackexchange.com/
Score:12
ธง cn
raj

ลองทำลายคำสั่งนี้ลง

  1. compress_size_bzip2=อะไรก็ได้ กำหนดค่าของตัวแปรเชลล์ที่เรียกว่า บีบอัด_size_bzip2 (แค่ชื่อไม่มีความหมายพิเศษ) ถึง อะไรก็ตาม ที่เขียนไว้ด้านขวามือของ = เข้าสู่ระบบ.

  2. ที่ อะไรก็ตาม ในกรณีของเราคือ $(คำสั่ง). มันคือ การแทนที่คำสั่ง; มูลค่าของโครงสร้างนี้จะเท่ากับอะไรก็ตาม สั่งการ เขียนออกมาในผลลัพธ์

  3. เดอะ สั่งการ เป็น: bzip2 "ไฟล์ $" ; stat -c %s "$file.bz2"ดังนั้น จริง ๆ แล้ว คำสั่งสองคำสั่งจะถูกดำเนินการทีละคำสั่ง คำสั่งแรก bzip2 "ไฟล์ $" บีบอัดไฟล์ที่มีชื่อนำมาจากตัวแปรเชลล์ ไฟล์. มีเครื่องหมายคำพูดในกรณีที่ชื่อมีช่องว่าง ปกติคำสั่งนี้จะไม่เขียนอะไรเลย คำสั่งที่สอง stat -c %s "$file.bz2"ส่งออกขนาดของไฟล์ที่ชื่อเป็นค่าของตัวแปรเชลล์ ไฟล์ บวกกับนามสกุล .bz2.

ขนาดนั้นคือผลลัพธ์ของทั้งหมด สั่งการและถูกกำหนดให้กับตัวแปร บีบอัด_size_bzip2.

หากคุณตั้งค่าตัวแปร ไฟล์ ไปยังชื่อไฟล์ที่คุณต้องการบีบอัด เป็นต้น ไฟล์=myfile.txtแล้วเรียกใช้บรรทัดด้านบน สองสิ่งจะเกิดขึ้น:

  1. ไฟล์ myfile.txt จะถูกบีบอัดเข้าไป myfile.txt.bz2
  2. ขนาดของไฟล์ myfile.txt.bz2 จะถูกกำหนดให้กับตัวแปร บีบอัด_size_bzip2. คุณสามารถแสดงค่านี้ได้ด้วยคำสั่ง เสียงสะท้อน $compress_size_bzip2.
Score:7
ธง in
  1. bzip2 "ไฟล์ $"
    

    สิ่งนี้จะทำงาน bzip2 บนชื่อไฟล์ที่บันทึกไว้ในตัวแปร "$file" bzip2 จะบีบอัดไฟล์เป็นไฟล์ใหม่ชื่อ $file.bz2.

  2. stat -c %s "$file.bz2"
    

    สิ่งนี้ทำงาน สถิติ ในการบีบอัดที่สร้างขึ้นใหม่ $file.bz2:

    จาก สถิติผู้ชาย:

    stat - แสดงสถานะไฟล์หรือระบบไฟล์
    
        -c --format=รูปแบบ
             ใช้รูปแบบที่ระบุแทนค่าเริ่มต้น
        ขนาดรวม %s หน่วยเป็นไบต์
    

    ดังนั้นสิ่งนี้ สถิติ คำสั่งจะคืนค่าขนาดไฟล์เป็นไบต์ของไฟล์ใหม่

  3. $(some_command)
    

    สิ่งนี้เรียกว่า การแทนที่คำสั่ง

    Bash ดำเนินการขยายโดยดำเนินการคำสั่งในสภาพแวดล้อม subshell และแทนที่การแทนที่คำสั่งด้วยเอาต์พุตมาตรฐานของคำสั่ง

    ดังนั้น, var=$(some_command) บันทึก เอาต์พุต ของ some_command ลงในตัวแปร วาร์.


เบ็ดเสร็จ:

compress_size_bzip2=$(bzip2 "$file" ; stat -c %s "$file.bz2")

สิ่งนี้ทำงาน bzip2 และ สถิติ ในเชลล์ย่อย ผลลัพธ์ของ subshell คือขนาดของไฟล์บีบอัดเป็นไบต์ ซึ่งจะถูกบันทึกในตัวแปร $compress_size_bzip2.


อย่างไรก็ตาม มีช่องว่างสำหรับการปรับปรุง:

คุณควรรวมคำสั่งใน subshell ด้วย &&, ดังนั้น สถิติ ทำงานเฉพาะเมื่อ bzip2 ประสบความสำเร็จ

หากคุณไม่ต้องการไฟล์บีบอัดคุณควรบอก bzip2 เพื่อบีบอัดเป็นเอาต์พุตมาตรฐานด้วย -ค ธงและการใช้งาน สุขา - ค เพื่อบอกขนาดของมัน:

compress_size_bzip2=$(bzip2 -c "$file" | wc -c)
2012rcampion avatar
kp flag
คำสั่งสุดท้ายไม่ทำงาน ตัวอธิบายไฟล์คือลิงก์สัญลักษณ์และ `stat` อ่านขนาดของ symlink เอง (64 ไบต์ในระบบของฉันเสมอ) คุณสามารถดูได้โดยลบตัวเลือก `-c %s` อย่างไรก็ตาม แม้ว่าเราจะได้รับ `stat` เพื่อไปตามลิงก์ที่มีตัวเลือก `-L` ไฟล์พื้นฐานจะเป็น fifo ดังนั้นขนาดจึงเป็นเพียงขนาดที่บัฟเฟอร์อยู่ในปัจจุบันเท่านั้น และเนื่องจาก `stat` ทำงานทันที `bzip2` จึงไม่มีเวลาเขียนอะไร และขนาดที่รายงานจะเป็นศูนย์ คุณควรใช้บางอย่างเช่น `bzip2 -c "$file" | แทน wc -c`
pLumo avatar
in flag
คุณพูดถูกอย่างสมบูรณ์ ฉันแทนที่คำสั่งที่ไม่ถูกต้อง ขอบคุณสำหรับหัวขึ้น.

โพสต์คำตอบ

คนส่วนใหญ่ไม่เข้าใจว่าการถามคำถามมากมายจะปลดล็อกการเรียนรู้และปรับปรุงความสัมพันธ์ระหว่างบุคคล ตัวอย่างเช่น ในการศึกษาของ Alison แม้ว่าผู้คนจะจำได้อย่างแม่นยำว่ามีคำถามกี่ข้อที่ถูกถามในการสนทนา แต่พวกเขาไม่เข้าใจความเชื่อมโยงระหว่างคำถามและความชอบ จากการศึกษาทั้ง 4 เรื่องที่ผู้เข้าร่วมมีส่วนร่วมในการสนทนาด้วยตนเองหรืออ่านบันทึกการสนทนาของผู้อื่น ผู้คนมักไม่ตระหนักว่าการถามคำถามจะมีอิทธิพลหรือมีอิทธิพลต่อระดับมิตรภาพระหว่างผู้สนทนา