Van-e mód arra, hogy az adott könyvtár összes fájlját a zip
paranccsal tömörítsük? Hallottam a *.*
használatáról, de azt szeretném, ha kiterjesztés nélküli fájloknál is működne.
Megjegyzések
Válasz
Csak a *
parancsot használhatja; nincs szükség a következőhöz: *.*
. A fájlkiterjesztések nem különlegesek a Unix rendszeren. *
nulla vagy annál több ch-vel felel meg karakterek – egy pontot is beleértve. Tehát megfelel a foo.png
kifejezésnek, mert ez nulla vagy több karakter (egészen pontosan hét).
Ne feledje, hogy *
alapértelmezés szerint nem egyezik a ponttal kezdődő fájlokkal (*.*
sem). Gyakran ezt akarja. Ha nem, akkor a bash-ban, ha shopt -s dotglob
megteszi (de a .
és ..
). Más héjak különböző módon (vagy egyáltalán nem) tartalmazzák a dotfájlok beillesztését.
Alternatív megoldásként a zip
is rendelkezik -r
(rekurzív) lehetőség teljes könyvtárfák egyszerre történő elvégzésére (és nem kell aggódnia a dotfile problémáért):
zip -r myfiles.zip mydir
ahol mydir
a fájlokat tartalmazó könyvtár. Vegye figyelembe, hogy az előállított zip tartalmazza a könyvtárstruktúrát, valamint a fájlokat. Mint Peter megjegyzi kommentárjában, ezt általában jó dolognak tekintik: a zip kibontása az összes kibontott fájlt szépen tárolja egy alkönyvtárban.
Azt is megadhatja a zip-nek, hogy ne tárolja az elérési utakat a -j
/ --junk-paths
opció.
A zip
parancs mellékelve van dokumentáció, amely ismerteti az összes (sok) opciót; írja be a man zip
parancsot a dokumentáció megtekintéséhez. Ez nem egyedülálló a zip-en; így a legtöbb parancshoz dokumentációt kaphat.
Megjegyzések
- Érdemes hozzáadni, hogy ez jó gyakorlatnak tekinthető, hogy az archívumban mindent megtalál egy felső szintű könyvtárban – így az ember nem szennyezi a kibontáskor a jelenlegi könyvtárát.
- @peterph kész. Bár ez kevésbé szokásos a zip fájlokban, mint például a tarfile-ekben, félek ‘.
- sajnos igen. Valószínűleg a Windows miatt A drag ‘ n ‘ húzás öröksége az asztalra és a linuxos örökség a forráskódokkal való munka során.
- Tartsa be ne feledje, hogy
*
shell-globbing nem tartalmaz ‘ t tartalmaz fájlokat (azaz.
). Ez egy másik előnye annak, ha az egész könyvtárat név szerint tömörítjük. - De az -r használata magában foglalja a könyvtárat is, ami megtöri az I ‘ m csinálom. A ‘ t * nem tartalmazna
.
és..
?
Válasz
Esetemben minden fájlt a saját archívumába akartam tömöríteni, ezért a következőket tettem (zsh
):
$ for file in *; do zip ${file%.*}.zip $file; done
Megjegyzések
- Ott ‘ nincs itt
mkv
? Itt semmi sem különösebbenzsh
-specifikus. ‘ meg akarja idézni a fájlnevet tartalmazó minden változót, tehátzip "${file%.*}.zip" "$file"
a kettős idézőjelekkel mindkét változó körül. - @tripleee Először is köszönöm, hogy rámutattak a
mkv
-re való téves hivatkozásomra. Másodszor, azzsh
fájlban az argumentumok idézése felesleges, ellentétben abash
fájlokkal. ‘ ezért adtam meg, hogy ez azsh
parancs. - Az utolsó pontosvessző cseréje egy ampersand jelentősen felgyorsíthatja (ha a könyvtárban lévő fájlok száma ésszerű …). Egyébként
find . -type f -maxdepth 1 -print0|xargs -r0 -n1 -P64 -I{} bash -c 'f="{}"; zip "${f%.*}.zip" "$f"'
(a-P
beállítással a CPU-szálak függvényében …) (Sok GNU-függőség …) - az egyes fájlok saját archívumába tömörítéséhez tegye a következőt:
gzip *
Válasz
Egy másik módszer a find és az xargs használata: (ez tartalmazhat egy “.” könyvtárat a zip-ben, de akkor is helyesen kell kibontania. A tesztemmel a zip levette a pontot tömörítés) find . -type f -exec zip zipfile.zip {} +
(A +
helyettesíthető a következővel: \;
ha az find
verziója nem támogatja az +
véget az exec számára. Lassabb lesz, bár …)
Ez alapértelmezés szerint az összes alkönyvtárat tartalmazza. A GNU-n a -maxdepth
keresés megakadályozhatja ezt.
Megjegyzések
- (ellentétben a
*
, ide tartoznak a dotfájlok, és nem fognak ‘ átesni, ha túl sok fájl van egy könyvtárban)
Válasz
Egy másik (lassú) módszer erre (egy fájl hozzáadása egyszerre a zip-hez):
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
Ennek a dotfile problémái vannak: *
(megkerülő megoldás hozzáadva), és minden fájlnál egyszer elindítaná a zip-et, hozzáadva az archívumhoz. A bash
könyvtárban nagy mennyiségű fájllal foglalkozna.
Lassabb lenne, mint a többi módszer, de viszonylag egyszerű.
Megjegyzések
- Azt mondanám, hogy ez kevésbé egyszerű, mint az elfogadott válasz, és lassabb, ami felveti a kérdést: ” Miért tenné ezt valaki? “. Ha tud választ adni erre a kérdésre, javasoljuk, hogy ezt a kontextust adja meg a válaszában, különben úgy gondolom, hogy ez rossz válasz egy régi kérdésre, amelyre már jó a válasz.
- @Centimane: Megjegyzem a korlátozásokat . Úgy érzem, ennek oktatási értéke van. (Ha nem hagyja ki a könyvtárakat, akkor az egészen egyszerű). Ha sokkal gyorsabb választ szeretne kapni egy (szokásos) külső eszköz használatával, akkor a másik válaszom ezt lefedi . (eltávolítva a dotfájlok kezelését (ami a kérdésben említett hiányuk nélkül befolyásolja a helyességet), elég elegánsnak érzem):
for f in *; do zip zip.zip "$f"; done
- Ne feledje, hogy az elfogadott A válasz nem használ ‘ külső parancsot, és gyorsabb lenne. Milyen forgatókönyv esetén lenne hasznos ez a válasz?
- @Centimane Tar-val, ha több fájl van, mint amit a bash átadhat paraméterként. (a find + xargs jobb, mert a ciklusok könnyebbek …). Ez egy (egyedi) válasz a kérdésre. Természetesen nem ez az optimális válasz. (A nem optimális válaszok továbbra is hasznosak lehetnek hasonló problémák esetén, ha valakinek kissé más a helyzete – pl. Tar fájlt szeretne könyvtárakkal ellátni)
zip myarch.zip mydir/*
?zip -r myarch.zip mydir/*
zip -r myarch.zip mydir
*.*
minden fájlt jelent, amelyen van egy pont. A cp / m és a dos fájlokban volt egy pont, és ez késztette a gépelésre (nem tudta megtenni*
). Ezért az emberek meglátogatták a*.*
mint az összes fájl. Végül a Microsoft hosszú fájlneveket adott hozzá, amelyeknek nulla vagy több pontja lehet. Ha olyan fájlt szeretne találni, amelyiken van egy pont a Windows rendszeren, írja be a következőt:*.*.*
.