डी-अनज़िप, डी-टार -xvf कैसे करें - गन्दा फ़ोल्डर में डी-अनार्कीव?


14

आमतौर पर, मैं चीजों को अनारकली करता हूं, $ mkdir newFolder; $ mv *.zip newFolder; $ cd newFolder; $unzip *.zipलेकिन कभी-कभी मैं आलसी हो जाता हूं और सिर्फ एक अनियंत्रित फ़ोल्डर में करता हूं $ unzip *.zipताकि समय-समय पर अन्य सामग्री के साथ खिलवाड़ हो। मैं यहां कुछ तरीकों की सूची दूंगा - कुछ संग्रह संस्करण में निश्चित रूप से भद्दे-झंडे होते हैं जबकि अन्य अधिक संयमी होते हैं, मुझे बाद के बारे में अधिक दिलचस्पी है।

डी-अनारकली के कुछ तरीके, क्या अन्य हैं?

  1. $ find . -anewer fileThatExistedBeforeUnarchieving -ok rm '{}' \;कमजोरी यह है कि यह *.zipडायरियों को सूचीबद्ध करता है , इसलिए आपको -okकई *.zipमैचों के साथ धीमी , धीमी गति से उपयोग करने की आवश्यकता होती है और किसी कारण से, यह निकाले गए सब कुछ से मेल नहीं खाता है।

  2. यदि छोटी मात्रा में निकाले गए फ़ाइल, एक-एक करके, धीमी, बोझिल और त्रुटि-प्रवण हैं।

  3. जब मैं यह सुनिश्चित करना चाहता हूं कि क्या $ unzip -l *.bsdआर्काइव की सामग्री वास्तव में एक फ़ोल्डर है, तो मैं कभी-कभी इसके साथ जांच करता हूं, कम से कम अस्पष्ट के अनज़िप-संस्करण में काम करता है।

यदि आप कुछ विशेष उपकरणों का जिक्र कर रहे हैं, तो कृपया, उपयुक्त होने पर उन्हें बताएं। हालांकि इसे सरल रखें - मुझे WAYS के बारे में अधिक दिलचस्पी है कि आप इसे कैसे करते हैं, बजाय एक उपकरण के।



यहाँ एक स्क्रिप्ट है जिसका उपयोग मैं mkdir; unzipसामान को स्वचालित करने के लिए करता हूँ इसलिए मैं इसे करने के लिए बहुत आलसी नहीं हूँ! svn.mikelward.com/svn/scripts/untar
मिकेल

2
इस संबंधित प्रश्न और उत्तर देखें: unix.stackexchange.com/questions/5123/…
एलेक्स

जवाबों:


11

नाम से

आप आर्काइव में फाइलों की सूची तैयार कर सकते हैं और उन्हें हटा सकते हैं, हालांकि यह नाराज है कि ऐसे फ़र्ज़ी नंबरों जैसे कि अनज़िप या 7z, जिनके पास फ़ाइल नामों की एक सादे सूची बनाने का विकल्प नहीं है। टार के साथ भी, यह मानता है कि फ़ाइल नामों में कोई नया विवरण नहीं है।

tar tf foo.tar | while read -r file; do rm -- "$file" done
unzip -l foo.zip | awk '
    p && /^ --/ {p=2}
    p==1 {print substr($0, 29)}
    /^ --/ {++p}
' | while …
unzip -l foo.zip | tail -n +4 | head -n -2 | while …  # GNU coreutils only
7z l -slt foo.zip | sed -n 's/^Path = //p' | while …  # works on tar.*, zip, 7z and more

फ़ाइलों को हटाने के बजाय, आप उन्हें उनके इच्छित स्थान पर ले जा सकते हैं।

tar tf foo.tar | while read -r file; do
  if [ -d "$file" ]; then continue; fi
  mkdir -p "/intended/destination/${file%/*}"
  mv -- "$file" "/intended/destination/$file"
done

FUSE का उपयोग करना

बाहरी उपकरणों पर निर्भर होने के बजाय, आप (अधिकांश यूनियनों पर) साधारण फ़ाइल सिस्टम कमांड का उपयोग करके अभिलेखागार में हेरफेर करने के लिए FUSE का उपयोग कर सकते हैं ।

आप फ्यूज-जिप का उपयोग जिप में झांकने के लिए कर सकते हैं , इसके साथ इसे निकाल सकते हैं cp, इसकी सामग्री की सूची बना सकते हैं find, आदि।

mkdir /tmp/foo.d
fuse-zip foo.zip /tmp/foo.d
## Remove the files that were extracted mistakenly (GNU/BSD find)
(cd /tmp/foo.d && find . \! -type d -print0) | xargs -0 rm
## Remove the files that were extracted mistakenly (zsh)
rm /tmp/foo.d/**(:"s~/tmp/foo.d/~~"^/)
## Extract the contents where you really want them
cp -Rp /tmp/foo.d /intended/destination
fusermount -u foo.d
rmdir foo.d

AVFS आपकी संपूर्ण निर्देशिका पदानुक्रम का दृश्य बनाता है जहां सभी अभिलेखागार में एक संबद्ध निर्देशिका होती है (अंत में # टैकल किए गए एक ही नाम) जो संग्रह सामग्री को रखती है।

mountavfs
## Remove the files that were extracted mistakenly (GNU/BSD find)
(cd ~/.avfs/"$PWD/foo.zip#" && find . \! -type d -print0) | xargs -0 rm
## Remove the files that were extracted mistakenly (zsh)
rm ~/.avfs/$PWD/foo.zip\#/**/*(:"s~$HOME/.avfs/$PWD/foo.zip#~~"^/)
## Extract the contents where you really want them
cp -Rp ~/.avfs/"$PWD/foo.zip#" /intended/destination
umountavfs

तिथि के अनुसार

यह मानते हुए कि आपके निष्कर्षण से समान पदानुक्रम में कोई अन्य गतिविधि नहीं हुई है, आप निकाले गए फ़ाइलों को उनके हाल के समय के द्वारा बता सकते हैं । यदि आपने ज़िप फ़ाइल बनाई या स्थानांतरित की है, तो आप इसे कटऑफ के रूप में उपयोग कर सकते हैं; अन्यथा ls -lctrएक उपयुक्त कटऑफ समय निर्धारित करने के लिए उपयोग करें। यदि आप यह सुनिश्चित करना चाहते हैं कि ज़िप को न हटाया जाए, तो कोई भी मैनुअल अनुमोदन करने का कोई कारण नहीं है: findउन्हें बाहर करने में पूरी तरह से सक्षम है। यहाँ उदाहरण हैं zsh या find; ध्यान दें कि -cminऔर -cnewerप्राइमरी POSIX में नहीं हैं लेकिन लिनक्स (और GNU खोजने के साथ अन्य प्रणालियों) पर मौजूद हैं, * BSD और OSX।

find . \! -name '*.zip' -type f -cmin -5 -exec rm {} +  # extracted <5 min ago
rm **/*~*.zip(.cm-6)  # zsh, extracted ≤5 min ago
find . -type f -cnewer foo.zip -exec rm {} +  # created or moved after foo.zip

GNU खोजने के साथ, FreeBSD और OSX, कटऑफ समय को निर्दिष्ट करने का एक और तरीका है कि एक फाइल touchबनाकर उसका माइम कटऑफ समय पर सेट किया जाए।

touch -d … cutoff
find . -type f -newercm cutoff -delete

फ़ाइलों को हटाने के बजाय, आप उन्हें उनके इच्छित स्थान पर ले जा सकते हैं। यहाँ GNU / * BSD / OSX खोज के साथ एक तरीका है, गंतव्य में निर्देशिकाओं को आवश्यकतानुसार बनाना।

find . \! -name . -cmin -5 -type f -exec sh -c '
    for x; do
      mkdir -p "$0/${x%/*}"
      mv "$x" "$0/$x"
    done
  ' /intended/destination {} +

Zsh समतुल्य (लगभग: यह संपूर्ण डाइरेक्टरी पदानुक्रम को पुन: उत्पन्न करता है, न कि केवल उन डाइरेक्टरीज़ में, जिनमें फाइलें होंगी):

autoload zmv
mkdir -p ./**/*(/cm-3:s"|.|/intended/destination|")
zmv -Q '(**/)(*)(.cm-3)' /intended/destination/'$1$2'

चेतावनी, मैंने इस उत्तर में अधिकांश कमांड का परीक्षण नहीं किया है। हमेशा हटाने से पहले फ़ाइलों की सूची की समीक्षा करें ( echoपहले चलाएं , rmअगर यह ठीक है)।


मैं आखिरकार आज इस समस्या में चला गया। जड़ के रूप में! अंत में मैंने "बाय नेम" और "बाय डेट" के संयोजन का उपयोग किया
फुनेहे

1

मैं बेवकूफ महसूस कर रहा हूं, वैसे भी मैंने इस तरह की समस्या होने पर इस स्क्रिप्ट को लिखने के लिए अपने सिर को खरोंच दिया। मैंने फ़ाइलों की सूची प्राप्त करने के लिए ध्वज के cpioसाथ उपयोग किया -it; आप अन्य अभिलेखों के लिए समतुल्य आदेशों का उपयोग कर सकते हैं। मुश्किल हिस्सा है, cpio संग्रह एक initrd से है और मुझे इसमें निकाला गया है /, इसलिए कई फ़ोल्डर्स और फ़ाइलों का एक ही नाम है जैसे कि एक कार्य प्रणाली। सौभाग्य से cpio ने मेरी किसी भी मौजूदा फाइल को अधिलेखित नहीं किया। मैं गलत कमांड से पहले मौजूद किसी भी चीज़ को डिलीट नहीं करने के लिए एक समय जाँच का उपयोग करता हूं।

#! /bin/sh

files=$(cpio -it < /mnt/temp/lglive.cpio)

for i in ${files}
do
    name=$(stat -c "%n" ${i})
    time=$(stat -c "%Y" ${i})
    # Time of the creation of the mess: 1296457595
    if [[ ${time} -gt 1296457590 && ${time} -lt 1296457600 ]]
    then
        if [[ -f ${name} ]]
        # If it is a file, it must have been created as part of the mess.
        then
            echo "rm ${name}"
        elif [[ -d ${name} ]]
        # If it is a directory, it may have been part of the mess
        # or maybe some files underneath it is created as part of the mess.
        then
            if [[ $(ls -A ${name}) ]]
            # If the directory contains something then don't delete it.
            then
                echo "${name} is not empty"
            # If the directory is empty then assume it is rubbish.
            else
                echo "rmdir ${name}"
            fi
        fi
    fi
done

echo "Files and directories still exist after the removal:"
for i in ${files}
do
    if [[ -e ${i} ]]
    then
        echo ${i}
    fi
done

0

कैसे संग्रह में फ़ाइलों की सूची खिलाने के बारे में xargs rm?

वह tar -tf tarbomb.tar | xargs rmया होगा unzip --list zipbomb.zip | xargs rm


2
दिए गए आदेश सामान्य मामले में काम नहीं करेंगे, और यह खतरनाक है क्योंकि आप फाइलें निकाल रहे हैं। xargsउम्मीद है कि इसका इनपुट अजीबोगरीब तरीके से उद्धृत किया गया है जो findउत्पादन नहीं करता है। उपयोग करें xargs -I rm {}ताकि xargs प्रति पंक्ति एक आइटम संसाधित करता है। अनज़िप कमांड के लिए, आपके पास क्या कार्यान्वयन है? मेरा (डेबियन / उबंटू) नहीं है --list, केवल -l, और यह सिर्फ फ़ाइल नाम नहीं छापता है, ताकि अतिरिक्त प्रसंस्करण की आवश्यकता हो।
गाइल्स का SO- बुराई पर रोक '13

@ गिल्स: 1) हां, यह खतरनाक है, लेकिन जब से हमने मूल फाइलों को अधिलेखित कर दिया है - वे पहले से ही चले गए हैं। 2) मैं बात नहीं कर रहा था find। 3) आप सही हैं unzip, मैंने परीक्षण नहीं किया और अनिर्दिष्ट लिस्टिंग के लिए कोई विकल्प नहीं है। कोई --listमेरी Ubuntu पर साथ ही साथ - मैं सिर्फ परीक्षण नहीं किया।
एलेक्स

डिब्बाबंद प्रतिक्रिया के लिए खेद है, के tar -tलिए स्थानापन्न find। लेकिन मेरे अन्य बिंदु खड़े हैं। एक वास्तविक जोखिम है कि दिए गए आदेश के रूप में एक असंबंधित फ़ाइल को हटा दिया जाएगा।
गिल्स एसओ- बुराई को रोकें '

tar -tf tarbomb.tarफ़ाइल नाम को प्रति पंक्ति एक प्रिंट करेगा, ताकि आप ऐसा कर सकें tar -tf tarbomb.tar | while IFS=$'\n' read -r filename; do rm "$filename"; doneया समान कर सकें ।
मिकेल

0

नहीं वास्तव में क्या आप के लिए पूछा, लेकिन कैसे के बजाय एक "सभी को खोलना" स्क्रिप्ट का उपयोग करने के बारे में।

unzip *.zip

इस तरह प्रत्येक फ़ाइल से आउटपुट स्वयं की निर्देशिका में चला जाता है।

#!/bin/bash
for f in *.zip ; do unzip -n "$f" -d "${f/%zip/out}"; done

0

मैं निम्नलिखित फ़ंक्शन का उपयोग zsh में करता हूं:

ununzip () {
    rm -r $(unzip -l $1 | grep -v 'Archive:' | \
    grep '[/.]' | sed 's![^a-zA-Z]([a-zA-Z./])!\1!')
}

यानी साफ किए गए आउटपुट में सभी फ़ाइलों को हटाने के लिए प्रतिस्थापन unzip -l

tar tvf एक समान तरीके से इस्तेमाल किया जा सकता है।

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.