CLI का उपयोग करके फ़ाइलों को अलग-अलग निर्देशिका में ले जाएं


9

मेरे पास एक पुरानी हार्ड ड्राइव से बड़ी संख्या में चित्र हैं जिन्हें मैं व्यवस्थित करने की कोशिश कर रहा हूं। अगर मैं दौड़ता हूं ls -l, तो मैं नोटिस करता हूं कि इन सभी फाइलों की निर्माण तिथि 2012 या उससे पहले है। आदर्श रूप में, मैं इन्हें अपने कंप्यूटर की दूसरी हार्ड ड्राइव पर ले जाना चाहूंगा, जो स्वचालित रूप से माउंट करने के लिए सेट नहीं है। अधिमानतः, मैं यह सब एक बैच के रूप में कर सकता था जिसमें कुछ कमांड एक साथ जुड़े थे। अब तक, मेरे पास ls -l | grep -i 2012वह तारीख है जो 2012 में उपलब्ध कराए गए तारीखों की फाइलों के साथ है ls -l। अब, यह ट्रिक cpउन सभी फाइलों को नई निर्देशिका में ले जाएगी। मुझे यकीन नहीं है कि इसके साथ आगे कहाँ जाना है क्योंकि प्रत्येक फ़ाइल को कॉपी करना होगा। मेरा अगला सेट क्या होगा?

जवाबों:


13

उपयोग न करें ls। यह ऐसे मामलों में उपयोग करने के लिए अनुशंसित नहीं है। इसके अलावा grepतिथि के अनुसार फ़िल्टर का उपयोग करना एक अच्छा विचार नहीं है। आपको फ़ाइल नाम में 2012स्ट्रिंग हो सकती है , भले ही इसे 2012 में संशोधित नहीं किया गया था।

findकमांड का उपयोग करें और इसके आउटपुट को पाइप करें ।

find . -newermt 20120101 -not -newermt 20130101 -print0 | xargs -0 cp -t /your/target/directory 

यहाँ,

-newermt 20120101  ==>  File's modified date should be newer than 01 Jan 2012
-not               ==>  reverses the following condition. Hence file should be older than 01 Jan 2013
-print0 and -0     ==>  Use this options so that the command doesn't fail when filenames contain spaces 

1
`-Exec mv {} / आपका / लक्ष्य / निर्देशिका \ 'नहीं होगा?' के बजाय '-प्रिंट 0 | xargs -0 cp -t / your / target / directory 'काम के नाम पर रिक्त स्थान के साथ समस्याओं के बारे में अच्छा है? (इसके अलावा, ओपी प्रतिलिपि को स्थानांतरित नहीं करना चाहता था )
हेगन वॉन एटिजन

^ ^ हाँ। दोनों एक ही उद्देश्य को प्राप्त करते हैं।
शिवाम्स

4

यदि आपके पास पुरानी डिस्क पर नई फाइलें हैं जिन्हें आप अनदेखा करना चाहते हैं तो मैं इसके बारे में इस तरह से जाऊंगा

  1. एक संशोधित मार्कर तिथि के साथ एक अस्थायी मार्कर फ़ाइल बनाएँ जो उन फ़ाइलों को अलग करती है जो मैं नहीं चाहता
  2. मार्कर फ़ाइल की तुलना में पुरानी फ़ाइलों को नए स्थान पर कॉपी करें

यहाँ इस के लिए नमूना आदेश, जो मानते हैं कि आप नए में पुराने डिस्क से किसी भी निर्देशिका पदानुक्रम को बनाए रखना चाहते हैं ( cpioएक प्रति आदेश, के समान है tarया pax):

touch -t 201201010000 /tmp/marker    # YYYYMMDDhhmm == Jan 1st, 2012
cd /path/to/old/disk
find . -type f \! -newer /tmp/marker -print0 | cpio -pmd0 /path/to/new/disk

2

मुझे लगता है कि शायद यह मुद्दा आपके जैसा ही है, आप इसे भी देख सकते हैं: उप-निर्देशिका बनाएं और तारीखों द्वारा फाइलें व्यवस्थित करें

मैं उस मुद्दे के पहले उत्तर पर आधारित यह नई स्क्रिप्ट लिखता हूं:

for x in *; do
  d=$(date -r "$x" +%Y)
  mkdir -p "/your/new/directory/$d"
  mv -- "$x" "/your/new/directory/$d/"
done
  1. इस स्क्रिप्ट को copy.shअपनी पुरानी डायरेक्टरी में नामित फ़ाइल में लिखें ।

  2. /your/new/directoryअपने नए निर्देशिका पथ के साथ बदलें

  3. इस फ़ाइल को निष्पादन योग्य बनाएं chmod +x copy.sh

  4. फिर इस फ़ाइल को निष्पादित करें ./copy.sh


1
आप कुछ अपवाद हैंडलिंग जोड़ना चाह सकते हैं, इसलिए स्क्रिप्ट स्वयं को 2015निर्देशिका में स्थानांतरित नहीं करती है ।
जी-मैन का कहना है कि 'मोनिका की बहाली

1

आपको शायद बैच ऑपरेशन के लिए बैच टूल का उपयोग करना चाहिए। ऐसा करने से आमतौर पर एक ही स्ट्रीम में सभी रिकॉर्ड को पढ़ने / लिखने के बजाय, उदाहरण के लिए, cpकॉपी की गई प्रत्येक फ़ाइल के लिए एक अलग प्रक्रिया को लागू करना होगा ।

यहां पहले से ही एक cpioउत्तर लिखा हुआ है, जो कि, पहले से ही उपलब्ध कराए गए विकल्पों को देखते हुए संभव है कि मैं क्या चुनूं। हालाँकि, इस cpioप्रारूप में सुधार किया गया है और इसे paxइसके बाद से मानकीकृत संग्रह प्रारूप में बदल दिया गया है । उसी का सच है tar

एक कड़ाई से POSIX- paxसंभवत: फ़ाइल संशोधन समय के आधार पर सीधे आर्काइव सदस्यों को छानने के लिए कोई विकल्प प्रदान नहीं करेगा - हालांकि मानक %Tसूची-मोड प्रारूप-संशोधक को निर्दिष्ट करता है । फिर भी, सबसे सामान्य रूप से उपलब्ध paxकार्यान्वयन जो मुझे पता है - जो कि mirabilos द्वारा अनुरक्षित बीएसडी संस्करण है - इसे सीधे सुलभ सीएलआई-स्विच में विस्तारित करता है।

उदाहरण के लिए, जिस पेड़ पर आप कर सकते हैं, ./उसमें पिछली बार संशोधित की गई सभी फाइलों को कॉपी ccyymmddHHMMकरने के /target/dirलिए:

pax -rwT,201301010000 ./ /target/dir

बच्चे की निर्देशिकाओं में आपको जगह देने से बचने के लिए:

pax -rwdT,201301010000 ./* /target/dir

manअधिक के लिए पेज देखें ।


मुझे लगता है कि मैं वास्तव में सीखना चाहिए pax, लेकिन tarऔर cpioअब भी मुझे अच्छी तरह से खड़े हैं। +1
रोएमा

@roaima - सख्ती से बोलना, जबकि एक वास्तविक paxसंग्रह प्रारूप है (जो कि ustar प्रारूप का विस्तार है ) , POSIX-spec'd pax उपयोगिता cpio, pax, और ustar प्रारूप पढ़ता / लिखता है। क्योंकि सभी तीन संग्रह प्रकारों में मुख्य रूप से सिर्फ एक ही स्ट्रीम में फाइलों के वास्तविक डेटा के साथ-साथ कई फ़ाइलों के लिए मेटाडेटा को अलग करने के विभिन्न साधनों के लिए राशि होती है, यह वास्तव में बहुत अधिक खिंचाव नहीं है। मैंने एक बार लिखा था shitar- जो कि शेल-स्क्रिप्ट की कुछ पंक्तियों के लिए था - ज्यादातर dd- tarपॉस कल्पना के आधार पर मक्खी पर ब्लॉक देवों को।
mikeserv

मुझे आपकी जुड़ी हुई स्क्रिप्ट पसंद है; अजीब तरह से यह ठीक उसी उद्देश्य के लिए कुछ महीने पहले बहुत उपयोगी रहा होगा। ओह अच्छा। मैं भी इस्तेमाल करने से रोकने की कोशिश कर सकता हूँ cpio -H ustar...
रोआमा
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.