Zip fișiere dintr-un director?

Există o modalitate de a zip toate fișierele într-un anumit director cu " zip " comanda? Am'am auzit de folosirea *.*, dar vreau să lucrez pentru extensionless fișiere, de asemenea.

Comentarii la întrebare (4)
Soluția

Puteți folosi doar *; nu este nevoie de *.*. Extensiile de fișiere nu sunt speciale pe Unix. * meciuri de zero sau mai multe caractere—inclusiv un punct. Deci se potrivește foo.png, pentru ca's zero sau mai multe caractere (șapte, pentru a fi exact).

Rețineți că * by default nu't se potrivi fișierele care încep cu un punct (nici nu *.*). Acest lucru este de multe ori ceea ce vrei. Dacă nu, în bash, dacă shopt -s dotglobva (dar va exclude.și..`). Alte scoici au moduri diferite (sau deloc), inclusiv dotfiles.

Alternativ, " zip " are, de asemenea, o `-r (recursive) opțiunea de a face întregul copaci director la o dată (și nu trebuie să vă faceți griji despre dotfile problema):

zip -r myfiles.zip mydir

unde mydir` este directorul care conține fișierele. Rețineți că a produs zip va conține structura de directoare, precum și fișierele. Ca peterph puncte în comentariul său, acest lucru este de obicei văzută ca un lucru bun: extragere zip va frumos stoca toate fișierele extrase într-un subdirector.

Puteți spune, de asemenea, zip pentru a nu stoca căi cu -j/--junk-căi opțiune.

La " zip " comanda vine cu o documentație vă spun despre toate ale sale (multe) opțiuni; tip om zip să văd că documentația. Asta e't unic pentru zip; puteți obține documentația pentru cele mai multe comenzi de acest fel.

Comentarii (16)

În cazul meu, am vrut să zip fiecare fișier în arhiva proprie, așa că am făcut următoarele (în zsh):

$ for file in *; do zip ${file%.*}.zip $file; done
Comentarii (3)

O altă modalitate ar fi de a găsi și de a folosi xargs: (aceasta ar putea include o "." director în cadrul zip, dar ar trebui să mai extrage corect. Cu testul meu, zip dezbrăcat la punct înainte de compresie) găsi . -tip f -exec zip zipfile.zip {} +

(Butonul " + "poate fi înlocuit cu \; dacă versiunea dumneavoastră de a "găsi" nu suport pe " + " end pentru exec. Acesta va fi mai lent, deși...)

Acest va în mod implicit include toate sub-directoarele. Pe GNU găsi-maxdepth` poate preveni asta.

Comentarii (1)

Un alt (lent) metoda pentru a face acest lucru (care adaugă un fișier zip la un moment dat):

for f in * .[^.]*; do
    [ -r "$f" ] || continue # Skip directories or non-existant files (Probably ".[^.]*" if directory has no dotfiles). Using -e will allow directories to be used as well
    zip zipfile.zip "$f" # If directories are included, you probably want to add -r
done

Acest lucru are dotfile probleme de * (soluție adăugată) și ar fi început zip o singură dată pentru fiecare fișier, adăugându-l la arhiva. În bash, s-ar face cu o cantitate mare de fișiere.

Ar fi mai lent decât cele mai multe alte metode, dar este relativ simplu.

Comentarii (4)