वर्ष, माह, तिथि के फ़ोल्डर पदानुक्रम के साथ एक फ़ोल्डर जिसका नाम YYYYMMDD है, को कैसे बदलें?


8

मेरे पास उन फ़ोल्डरों की एक सूची है जिनके पास नामों की तारीख है। दिनांक YYYYMMDD (जैसे 20150129) प्रारूप में हैं। इन फ़ोल्डरों के भीतर पाठ दस्तावेज़ हैं जो उस विशिष्ट तिथि से संबंधित हैं।

मैं उन्हें साल-दर-साल एक फ़ोल्डर पदानुक्रम में पुनर्गठन करना चाहता हूं, और पाठ दस्तावेज़ों को पदानुक्रम में नीचे की ओर इसी 'दिनांक' फ़ोल्डर में ले जाना।

दूसरे शब्दों में, मैं चाहूंगा कि 'रूट' फोल्डर को वर्ष 2015 की तरह साल के नाम पर रखा जाए, और फिर 01 जैसे महीनों के साथ नाम वाले उप-फ़ोल्डर्स बनाएं, और फिर 29 जैसी तारीखों के साथ नामित उप-फ़ोल्डर्स बनाएं जो संबंधित पाठ दस्तावेज़ों को रखते हैं। ।

तो पथ कैसा लगेगा 2015/01/29/file.txtया 2015>01>29>file.txt

मैंने ऑटोमेकर पर एक नज़र डाली है और ऐसा लगता है कि ऐसा कुछ संभव नहीं है हालांकि मैं गलत हो सकता हूं, इसलिए मैं जानना चाहूंगा ...

  1. क्या इस समस्या का कोई आसान समाधान है जिसे कोई भी आम आदमी समझ सकता है, उदाहरण के लिए एक ऑटोमेटर वर्कफ़्लो, या क्या इसके लिए टर्मिनल कमांड और नियमित एक्सप्रेशन की कुछ समझ की आवश्यकता होती है?

  2. इस समस्या का समाधान कैसे होगा, बशर्ते वास्तव में कोई समाधान हो?


किसने इस प्रश्न को "बहुत व्यापक" के रूप में बंद करने के लिए मतदान किया, क्यों? मैं इस सवाल के बारे में "बहुत व्यापक" के रूप में उत्सुक हूं?
user3439894

क्या ये सभी YYYMMDD फ़ोल्डर सीधे एक मास्टर फ़ोल्डर के अंदर हैं या वे एक व्यापक पदानुक्रम में फैले हुए हैं?
nohillside

@patrix मेरे मामले में वे सभी एक ही निर्देशिका या मास्टर फ़ोल्डर में हैं
davidjnatarajan

जवाबों:


8

इन सभी YYYYMMDD फ़ोल्डरों को उसी मूल निर्देशिका का हिस्सा माना जाता है जिसे आप चला सकते हैं

cd PARENT_DIRECTORY
for d in */; do
    [[ $d =~ [0-9]{8}/ ]] || continue
    mkdir -p -- "${d:0:4}/${d:4:2}"
    mv -- "$d" "${d:0:4}/${d:4:2}/${d:6:2}"
done
  • for d in */; doपाश सभी निर्देशिका प्रविष्टियों पढ़ता है, अनुगामी /सुनिश्चित होगा कि केवल निर्देशिका नाम वास्तव में मेल खाते हैं
  • [[ $d =~ [0-9]{8}/ ]] परीक्षण कि वर्तमान प्रविष्टि में 8 अंक हैं, और यदि नहीं तो अगली प्रविष्टि के साथ जारी है
  • ${d:0:4}/${d:4:2}/${d:6:2}bashनया पथ युक्त स्ट्रिंग बनाने के लिए पैरामीटर विस्तार का उपयोग करता है
  • --दोनों में mkdirऔर mvमामले में रोकता है समस्या एक साथ निर्देशिका या फ़ाइल नाम शुरू होता है -। यह यहाँ नहीं हो सकता है, लेकिन यह शायद वैसे भी अच्छा अभ्यास है।

मूल स्क्रिप्ट को कैसे बेहतर बनाया जाए, इस पर विचारों के लिए @terdon और @ user3439894 को धन्यवाद।


उत्तर के लिए धन्यवाद, यह पूरी तरह से काम करता है! मुझे लगता है कि यह समाधान @grgarside द्वारा प्रदान किए गए से बेहतर है क्योंकि यह बहुत जल्दी है, खासकर जब हजारों पाठ दस्तावेज़ों सहित बड़े पैमाने पर कॉर्पस से निपटते हैं।
दविदाजनतरजन

8

आप टर्मिनल में निम्नलिखित का उपयोग कर सकते हैं। cdयुक्त फ़ोल्डर में, फिर निम्न चलाएँ:

find . -type f -exec bash -c \
  'F=$(sed -E "s#^\./([0-9]{4})([0-9]{2})([0-9]{2})#\1/\2/\3#" <<< $1);\
  mkdir -p -- $(dirname "$F");\
  mv -- "$1" "$F"' - {} \;

find . -type fवर्तमान निर्देशिका में प्रत्येक फ़ाइल को पुन: प्राप्त करता है।
-exec bash -cनिम्न आदेशों को चलाने के लिए एक खोल खोलता है।
F=$(…)एक उपखंड खोलता है और फ़ोल्डर में पथ में हेरफेर करने के लिए फ़ाइल पथ पर sed का उपयोग करता है।
^\./([0-9]{4})([0-9]{2})([0-9]{2})तीन कैप्चर समूहों के साथ एक रेगेक्स है, इस प्रकार है: प्रतिस्थापन, जहां प्रत्येक कैप्चर ग्रुप ( , आदि) द्वारा अलग किया जाता है । फ़ाइलों को स्थानांतरित करने के लिए निर्देशिका बनाता है। प्रत्येक फ़ाइल को उसके संबंधित फ़ोल्डर में ले जाता है।
\1/\2/\3\1/
mkdir -p -- $(dirname "$F")
mv -- "$1" "$F"

यह बाईं ओर पदानुक्रम लेता है और इसे दाईं ओर पदानुक्रम में परिवर्तित करता है:

├── 20170201               └── 2017
   └── abcdefghij             ├── 02
└── 20170302                      └── 01
    └── abcdefghij 2                  └── abcdefghij
                               └── 03
                                   └── 02
                                       └── abcdefghij 2

यदि नाम के रूप में दिनांक वाली फ़ोल्डर में अन्य फ़ाइलें हैं, तो उन्हें ले जाया जाएगा जैसे कि वे एक फ़ोल्डर हैं। इसे रोकने के लिए, दूसरी पंक्ति को इसके साथ बदलें:

  'F=$(sed -E "s#^\./([0-9]{4})([0-9]{2})([0-9]{2})(?:/.+)#\1/\2/\3#" <<< $1);\

यह (?:/.+)सुनिश्चित करता है कि पथ में एक बाद का घटक है, इसलिए माता-पिता की निर्देशिका में एक बच्चे के बिना कुछ भी अनदेखा करना जो फाइलें हैं।


@klanomath regex101.com
GRG

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