Puncte:2

Cum funcționează acest cod pentru a comprima un fișier?

drapel us

Am citit această linie de cod:

compress_size_bzip2=$(bzip2 „$fișier” ; stat -c %s „$fișier.bz2”)

Mă poate ajuta cineva să înțeleg această comandă și cum pot scrie acest cod în alte moduri?

James S. avatar
drapel de
Aceasta nu este o întrebare despre Ubuntu. În viitor, atunci când puneți întrebări generale despre Unix și Linux, ar trebui să utilizați acel stackexchange: https://unix.stackexchange.com/
Puncte:12
drapel cn
raj

Să descompun această comandă.

  1. compress_size_bzip2=orice setează valoarea variabilei shell numită compress_size_bzip2 (doar un nume fără semnificație specială) să orice care este scris în mâna dreaptă a = semn.

  2. Acea orice în cazul nostru este $(comandă). Acesta este un înlocuirea comenzii; valoarea acestui construct este egală cu orice comanda scrie în ieșire.

  3. The comanda este: bzip2 „$fișier” ; stat -c %s „$file.bz2”, deci de fapt două comenzi executate una după alta. Prima comandă, bzip2 „$fișier” comprimă fișierul al cărui nume este preluat din variabila shell fişier. Ghilimele sunt acolo în cazul în care numele conține spații. În mod normal, această comandă nu scrie nimic. A doua comandă, stat -c %s „$file.bz2”, afișează dimensiunea fișierului al cărui nume este valoarea variabilei shell fişier plus extensia .bz2.

Deci dimensiunea este rezultatul întregului comanda, și este atribuit variabilei compress_size_bzip2.

Dacă setați variabila fişier la numele fișierului pe care doriți să-l comprimați, de exemplu fișier=fișierul meu.txt, și apoi rulați linia de mai sus, se vor întâmpla două lucruri:

  1. fișierul myfile.txt va fi comprimat în myfile.txt.bz2
  2. dimensiunea fișierului myfile.txt.bz2 va fi atribuit variabilei compress_size_bzip2. Puteți afișa această valoare cu comanda echo $compress_size_bzip2.
Puncte:7
drapel in
  1. bzip2 „$fișier”
    

    Aceasta va rula bzip2 pe numele fișierului salvat într-o variabilă „$file”. bzip2 va comprima fișierul într-un fișier nou numit $file.bz2.

  2. stat -c %s „$file.bz2”
    

    Aceasta rulează stat pe compresa nou creată $file.bz2:

    Din om stat:

    stat - afișează starea fișierului sau a sistemului de fișiere
    
        -c --format=FORMAT
             utilizați FORMATUL specificat în loc de cel implicit
        %s dimensiune totală, în octeți
    

    Deci asta stat comanda va returna dimensiunea fișierului în octeți a noului fișier.

  3. $(some_command)
    

    Aceasta se numește înlocuirea comenzii

    Bash efectuează extinderea executând comanda într-un mediu subshell și înlocuind înlocuirea comenzii cu ieșirea standard a comenzii.

    Asa de, var=$(some_command) salvează ieșire de some_command într-o variabilă var.


In total:

compress_size_bzip2=$(bzip2 „$fișier” ; stat -c %s „$fișier.bz2”)

Aceasta rulează bzip2 și stat într-un subshell. Ieșirea subshell-ului este dimensiunea fișierului comprimat în octeți, care va fi salvat într-o variabilă $compress_size_bzip2.


Cu toate acestea, există loc de îmbunătățire:

Ar trebui să combinați comenzile din subshell cu &&, asa de stat rulează doar când bzip2 a avut succes.

Dacă nu aveți nevoie de un fișier comprimat, ar trebui să spuneți bzip2 pentru a comprima la ieșire standard cu -c steag și folosiți wc -c pentru a-i spune dimensiunea:

compress_size_bzip2=$(bzip2 -c „$fișier” | wc -c)
2012rcampion avatar
drapel kp
Ultima comandă nu funcționează; descriptorul de fișier este o legătură simbolică și `stat` citește dimensiunea link-ului simbolic în sine. (Întotdeauna 64 de octeți pe sistemul meu). Puteți vedea acest lucru eliminând opțiunea `-c %s`. Totuși, chiar dacă obținem ca `stat` să urmeze linkul cu opțiunea `-L`, fișierul de bază este un fifo, așa că dimensiunea este doar ceea ce este în buffer în prezent; și din moment ce `stat` rulează imediat `bzip2` nu are timp să scrie nimic și dimensiunea raportată va fi zero. În schimb, ar trebui să utilizați ceva de genul `bzip2 -c „$file” | wc -c`.
pLumo avatar
drapel in
Ai perfectă dreptate. Am înlocuit comanda greșită. Mulțumesc pentru headsup.

Postează un răspuns

Majoritatea oamenilor nu înțeleg că a pune multe întrebări deblochează învățarea și îmbunătățește legătura interpersonală. În studiile lui Alison, de exemplu, deși oamenii își puteau aminti cu exactitate câte întrebări au fost puse în conversațiile lor, ei nu au intuit legătura dintre întrebări și apreciere. În patru studii, în care participanții au fost implicați în conversații ei înșiși sau au citit transcrieri ale conversațiilor altora, oamenii au avut tendința să nu realizeze că întrebarea ar influența – sau ar fi influențat – nivelul de prietenie dintre conversatori.