Onko mahdollista pakata kaikki tietyn hakemiston tiedostot komennolla zip? Olen kuullut *.* -ohjelman käytöstä, mutta haluan sen toimivan myös laajennuksettomissa tiedostoissa.

Kommentit

  • Oletko yrittänyt navigoida tasolla ylöspäin haluamastasi hakemistosta ja tehdä zip myarch.zip mydir/*?
  • tai parempi zip -r myarch.zip mydir/*
  • tai parempi 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 *.*.*.

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”>

.

  • valitettavasti kyllä. Luultavasti ikkunoiden takia vetämisen perintö ’ n ’ pudota työpöydälle ja Linux-perinnölle lähdekoodien kanssa.
  • Pidä Pidä mielessä, että * kuori-huojuminen ei sisällä ’ t myös dotfileitä (ts. .). Tämä on toinen etu koko hakemiston purkamiselle nimellä.
  • Mutta -r: n käyttäminen sisältää itse hakemiston, joka rikkoo I id = ”ab8b7445e2”> m tekemässä. Pitäisikö ’ t * sisältää . 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 erityisen zsh -spesifistä. ’ haluat lainata kaikki muuttujat, jotka sisältävät tiedostonimen, joten zip "${file%.*}.zip" "$file" kaksoislainausmerkeillä molempien muuttujien ympärille.
    • @tripleee Ensinnäkin kiitos, että osoitit virheellisen viittauksen mkv -viittaukseen. Toiseksi argumenttien lainaaminen on tarpeetonta kohdassa zsh, toisin kuin kohdassa bash. Siksi määritin ’ s, että tämä oli komento zsh.
    • 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)

    Vastaa

    Sähköpostiosoitettasi ei julkaista. Pakolliset kentät on merkitty *