नाम से
आप आर्काइव में फाइलों की सूची तैयार कर सकते हैं और उन्हें हटा सकते हैं, हालांकि यह नाराज है कि ऐसे फ़र्ज़ी नंबरों जैसे कि अनज़िप या 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
अगर यह ठीक है)।