Onko mahdollista pakata kaikki tietyn hakemiston tiedostot komennolla zip
? Olen kuullut *.*
-ohjelman käytöstä, mutta haluan sen toimivan myös laajennuksettomissa tiedostoissa.
Kommentit
vastaus
Voit käyttää vain *
; ei tarvita kohteelle *.*
. Tiedostotunnisteet eivät ole erityisiä Unixissa. *
vastaa nollaa tai enemmän kanavaa merkit – mukaan lukien piste. Joten se vastaa foo.png
, koska se on nolla tai useampia merkkejä (tarkalleen seitsemän).
Huomaa, että *
ei oletusarvoisesti täsmää pisteellä alkaviin tiedostoihin (ei *.*
). Tämä on usein mitä haluat. Jos ei, bashissa, jos shopt -s dotglob
se (mutta silti sulkee pois .
ja ..
). Muilla kuoreilla on eri tapoja (tai ei lainkaan) sisällyttää dotfile-tiedostoja.
Vaihtoehtoisesti zip
: llä on myös -r
(rekursiivinen) vaihtoehto tehdä kokonaisia hakemistopuita kerralla (eikä sinun tarvitse huolehtia dotfile-ongelmasta):
zip -r myfiles.zip mydir
missä mydir
on hakemisto, joka sisältää tiedostosi. Huomaa, että tuotettu zip sisältää hakemistorakenteen sekä tiedostot. Kuten Peterph huomauttaa kommentissaan, tämä nähdään yleensä hyvänä: zip-paketin purkaminen tallentaa kaikki puretut tiedostot siististi yhteen alihakemistoon.
Voit myös kertoa zip: lle, ettei polkuja tallenneta polkuja -j
/ --junk-paths
vaihtoehto.
Komennon zip
mukana tulee dokumentaatio, jossa kerrotaan kaikista sen (monista) vaihtoehdoista; kirjoita man zip
nähdäksesi kyseisen dokumentaation. Tämä ei ole ainutlaatuinen zip-tiedostolle; voit saada dokumentaation useimmista komennoista tällä tavalla.
Kommentit
- Voit lisätä, että se on katsottiin hyväksi käytännöksi sisällyttää kaikki arkistossa olevat tiedot ylätason hakemistoon, jotta ’ ei saastutettaisi nykyistä hakemistoa purkamisen yhteydessä.
- @peterph tehty. Vaikka tämä onkin vähemmän käytäntö zip-tiedostoissa kuin esim. tarfileissä, pelkään.
- id = ”ab8b7445e2”>
.
*
kuori-huojuminen ei sisällä ’ t myös dotfileitä (ts. .
). Tämä on toinen etu koko hakemiston purkamiselle nimellä. .
ja ..
? vastaus
Minun tapauksessani halusin pakata jokaisen tiedoston omaan arkistoonsa, joten tein seuraavan (kohdassa zsh
):
$ for file in *; do zip ${file%.*}.zip $file; done
Kommentit
- Siellä ’ eikö
mkv
ole täällä? Myöskään mikään tässä ei ole erityisenzsh
-spesifistä. ’ haluat lainata kaikki muuttujat, jotka sisältävät tiedostonimen, jotenzip "${file%.*}.zip" "$file"
kaksoislainausmerkeillä molempien muuttujien ympärille. - @tripleee Ensinnäkin kiitos, että osoitit virheellisen viittauksen
mkv
-viittaukseen. Toiseksi argumenttien lainaaminen on tarpeetonta kohdassazsh
, toisin kuin kohdassabash
. Siksi määritin ’ s, että tämä oli komentozsh
. - Korvataan viimeinen puolipiste kaksoispisteellä ja -merkki saattaa nopeuttaa sitä merkittävästi (jos hakemistossa olevien tiedostojen määrä on kohtuullinen …). Muuten
find . -type f -maxdepth 1 -print0|xargs -r0 -n1 -P64 -I{} bash -c 'f="{}"; zip "${f%.*}.zip" "$f"'
(kun-P
on säädetty suorittimen ketjujen mukaan …) (Monet GNU-riippuvuudet …) - pakataksesi kukin tiedosto omaan arkistoonsa, tee
gzip *
vastaus
Toinen tapa olisi käyttää find ja xargs: (tämä saattaa sisältää ”.” -hakemiston zip-tiedostossa, mutta sen pitäisi silti purkaa oikein. Testissäni zip irrotti pisteen ennen pakkaaminen) find . -type f -exec zip zipfile.zip {} +
(+
voidaan korvata nimellä \;
jos find
-versiosi ei tue exec-loppua +
. Se on kuitenkin hitaampaa …)
Tämä sisältää oletuksena kaikki alihakemistot. GNU: n löytäminen -maxdepth
voi estää tämän.
Kommentit
- (toisin kuin ratkaisut, joissa käytetään
*
, tämä sisältää dot-tiedostot ja ei kaadu ’ ei kaadu, jos hakemistossa on liikaa tiedostoja)
vastaus
Toinen (hidas) tapa tehdä tämä (joka lisää yhden tiedoston zip-tiedostoon kerrallaan):
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
Tässä on dotfile-ongelmat *
(kiertotapa lisätty), ja se olisi aloitettava zip-tiedosto jokaiselle tiedostolle, lisäämällä se arkistoon. Kohdassa bash
se käsittelisi suurta määrää tiedostoja.
Se olisi hitaampaa kuin useimmat muut menetelmät, mutta on suhteellisen yksinkertainen.
Kommentit
- Sanoisin, että tämä on vähemmän yksinkertaista kuin hyväksytty vastaus ja hitaampi, mikä herättää kysymyksen: ” Miksi kukaan tekisi tämän? ”. Jos pystyt vastaamaan kysymykseen, suosittelen, että laitat vastauksen asiayhteyteen, muuten mielestäni se on huono vastaus vanhaan kysymykseen, jolla on jo hyvä vastaus.
- @Centimane: Huomaan rajoitukset . Minusta tällä on koulutuksellista arvoa. (Ellei ohita hakemistoja, se on melko yksinkertaista). Jos haluat paljon nopeamman vastauksen käyttämällä (tavallista) ulkoista työkalua, toinen vastaukseni kattaa sen. (kun dotfileiden käsittely on poistettu (mikä vaikuttaa virheettömyyteen ilman kysymyksessä mainittua poissaoloa), mielestäni se on melko tyylikäs):
for f in *; do zip zip.zip "$f"; done
- Huomaa, että hyväksytty vastaus ei käytä ’ t ulkoista komentoa ja olisi nopeampi. Missä tilanteessa tämä vastaus olisi hyödyllinen?
- @Centimane Tar: lla, kun tiedostoja on enemmän kuin mitä bash voi siirtää parametreina. (find + xargs ovat parempia, silmukat ovat helpompia …). Se on (ainutlaatuinen) vastaus kysymykseen. Se ei todellakaan ole optimaalinen vastaus. (Ei-optimaaliset vastaukset voivat silti olla hyödyllisiä vastaavien ongelmien ratkaisemiseksi, jos joku on hieman erilaisessa tilanteessa – esim. Haluaa tervatiedostoa hakemistoja varten)
zip myarch.zip mydir/*
?zip -r myarch.zip mydir/*
zip -r myarch.zip mydir
*.*
tarkoittaa mitä tahansa tiedostoa, jossa on piste. cp / m ja dos kaikissa tiedostoissa oli piste, ja se sai sinut kirjoittamaan sen (ei voinut tehdä*
). Siksi ihmiset tulivat näkemään*.*
kuten kaikki tiedostot. Lopulta Microsoft lisäsi pitkät tiedostonimet, joissa voi olla nolla tai enemmän pisteitä. Jos haluat löytää tiedoston, jossa on piste Windowsissa, kirjoita*.*.*
.