उप-फ़ोल्डर्स के बिना कई फ़ाइलों के साथ ज़िप कैसे बनाएं?


12

प्रारंभिक स्थिति:

.
├── d0
├── f0
├── f1
│   └── d1
└── f2
    └── f3
        ├── d2
        ├── d3
        └── d4

मुझे क्या करना है:

मैं d0, d1 और d4 युक्त ज़िप बनाना चाहता हूं जिसमें गिरने की संरचना होनी चाहिए:

.
├── d0
├── d1
└── d4

मैंने पहले से ही क्या प्रयास किया है:

मैंने इसके साथ प्रयास किया zip myfiles d0 f1/d1 f2/f3/d4। लेकिन यह मूल फ़ोल्डर संरचना रखता है, जो कि मैं नहीं चाहता।

.
├── d0
├── f1
│   └── d1
└── f2
    └── f3
        └── d4

प्रश्न उप-फ़ोल्डर्स के बिना कई फ़ाइलों के साथ एक ज़िप कैसे बनाएं?

जवाबों:


17

मैन्युअल रूप से, आप ज़िप फ़ाइल और इसे अपडेट कर सकते हैं:

zip myfiles d0
(cd f1; zip -u ../myfiles.zip d1)
(cd f2/f3; zip -u ../../myfiles.zip d4)

कोष्ठक उप-आधार बनाते हैं, और cdकेवल उप-संस्करण में ही प्रभाव होता है , इसलिए आपको cdमूल निर्देशिका में वापस नहीं जाना पड़ता है ।

यदि d1, d2आदि वास्तव में फाइलें हैं और स्वयं निर्देशिका नहीं हैं, तो -jविकल्प का उपयोग करें :

-j
--junk-paths
केवल एक सहेजी गई फ़ाइल का नाम स्टोर करें (रद्दी पथ), और निर्देशिका नामों को संग्रहीत न करें। डिफ़ॉल्ट रूप से, ज़िप पूरा पथ (वर्तमान निर्देशिका के सापेक्ष) संग्रहीत करेगा।


19

आप पथ findसूची zip -j myfilesको अनदेखा करने के लिए फ़ाइल सूची प्राप्त करने और उन्हें निष्पादित करने के लिए उपयोग कर सकते हैं :

find . -name "d[014]" -exec zip -j myfiles {} +

उदाहरण

$ tree
.
├── d0
├── f0
├── f1
│   └── d1
└── f2
    └── f3
        ├── d2
        ├── d3
        └── d4

$ find . -name "d[014]" -exec zip -j myfiles {} +
  adding: d1 (stored 0%)
  adding: d4 (stored 0%)
  adding: d0 (stored 0%)

$ unzip -l myfiles.zip
Archive:  myfiles.zip
  Length      Date    Time    Name
---------  ---------- -----   ----
        0  2017-10-09 10:47   d1
        0  2017-10-09 10:48   d4
        0  2017-10-09 10:47   d0
---------                     -------
        0                     3 files

हालाँकि यह केवल फाइलों के लिए काम करता है , निर्देशिकाओं को नजरअंदाज कर दिया जाएगा zip -j। निर्देशिकाओं के लिए यह काम करने के लिए, यह कहें कि हम पैक करना चाहते हैं d0, d1और पूरी f3निर्देशिका उपरोक्त उदाहरण में, findलाइन थोड़ी और जटिल हो जाती है:

$ find . \( -name "d[01]" -o -name "f3" \) -exec sh -c 'p=$(pwd); for i in $0 $@; do cd ${i%/*}; zip -ur "$p"/myfiles ${i##*/}; cd "$p"; done' {} +
        zip warning: /home/dessert/myfiles.zip not found or empty
  adding: d1 (stored 0%)
  adding: f3/ (stored 0%)
  adding: f3/d3 (stored 0%)
  adding: f3/d2 (stored 0%)
  adding: f3/d4 (stored 0%)
  adding: d0 (stored 0%)
$ unzip -l myfiles.zip 
Archive:  myfiles.zip
  Length      Date    Time    Name
---------  ---------- -----   ----
        0  2017-10-11 10:18   d1
        0  2017-10-11 10:19   f3/
        0  2017-10-11 10:19   f3/d3
        0  2017-10-11 10:19   f3/d2
        0  2017-10-11 10:19   f3/d4
        0  2017-10-11 10:17   d0
---------                     -------
        0                     6 files

18

-J विकल्प का उपयोग करने से फ़ाइल से पथ निकल जाएगा।

zip -j myfiles d0 f1/d1 f2/f3/d4 

संदर्भ


यदि आप जिन रास्तों से गुजर रहे हैं, वे फाइलें नहीं हैं, लेकिन निर्देशिकाएं हैं, उन निर्देशिकाओं को विकल्प के zipसाथ फाइल में नहीं जोड़ा जाएगा -j
दान

@dan आप तो पथ बाहर के साथ एक निर्देशिका में सभी फाइलों चाहते --ifzip -j myfiles directory/*
ravery
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.