Existuje spôsob, ako zazipovať všetky súbory v danom adresári pomocou príkazu zip
? Počul som o použití *.*
, ale chcem, aby to fungovalo aj pre súbory bez prípon.
Stačí použiť *
; *.*
nie je potrebné. Prípony súborov nie sú v Unixe špeciálne. *
zodpovedá nule alebo viacerým znakom - vrátane bodky. Takže zodpovedá foo.png
, pretože to je nula alebo viac znakov (presne sedem).
Všimnite si, že *
štandardne nezodpovedá súborom začínajúcim bodkou (ani *.*
). To je často to, čo chcete. Ak nie, v bash, ak použijete shopt -s dotglob
, bude to tak (ale stále bude vylučovať .
a ..
). Iné shelly majú rôzne spôsoby (alebo nemajú vôbec žiadne), ako zahrnúť súbory s bodkami.
Alternatívne má zip
aj voľbu -r
(rekurzívny), ktorá umožňuje robiť celé adresárové stromy naraz (a nemusíte sa obávať problému s bodovými súbormi):
zip -r myfiles.zip mydir
kde mydir
je adresár obsahujúci vaše súbory. Všimnite si, že vytvorený súbor zip bude obsahovať adresárovú štruktúru, ako aj súbory. Ako upozorňuje peterph vo svojom komentári, zvyčajne sa to považuje za dobrú vec: rozbalenie zip prehľadne uloží všetky rozbalené súbory do jedného podadresára.
Zipu môžete tiež povedať, aby neukladal cesty pomocou voľby -j
/--junk-paths
.
K príkazu zip
sa dodáva dokumentácia, ktorá vás informuje o všetkých jeho (mnohých) možnostiach; ak chcete vidieť túto dokumentáciu, zadajte man zip
. Toto nie je jedinečné pre príkaz zip; takto môžete získať dokumentáciu k väčšine príkazov.
V mojom prípade som chcel zazipovať každý súbor do vlastného archívu, takže som urobil nasledovné (v zsh
):
$ for file in *; do zip ${file%.*}.zip $file; done
Ďalším spôsobom by bolo použiť find a xargs: (to môže obsahovať adresár "." v zip, ale aj tak by sa mal správne rozbaliť. Pri mojom teste zip pred kompresiou odstránil bodku)
find . -type f -exec zip zipfile.zip {} +
(Znak +
môžete nahradiť znakom \;
, ak vaša verzia programu find
nepodporuje koniec +
pre exec. Bude to však pomalšie...)
Toto predvolene zahrnie všetky podadresáre. V GNU find tomu môže zabrániť -maxdepth
.