लिनक्स पर फ़ाइल का नाम बदलें


1

मेरे पास इस तरह के फ़ाइल नामों के साथ बहुत अधिक डेटा है:

20110.bil
20111.bil
20112.bil
...
2011150.bil
2011151.bil
2011152.bil

ऊपर फ़ाइल नाम का पैटर्न है:

year+(0-152)

0-152 का मतलब 1 अगस्त से 31 दिसंबर है।

मैं उस फ़ाइल का नाम बदलना चाहता हूं

20110801.bil
20110802.bil
20110803.bil
............
............
20111229.bil
20111230.bil
20111231.bil

फ़ाइल नाम का पैटर्न जो मुझे चाहिए वह है:

year+month+day.

मैं अपनी समस्या कैसे हल करूं?


कृप्या हमेशा अपने OS को शामिल करें। समाधान बहुत बार उपयोग किए जा रहे ऑपरेटिंग सिस्टम पर निर्भर करते हैं। आप किस लिनक्स वितरण का उपयोग कर रहे हैं? rename उपयोगिता यहां उपयोगी हो सकती है लेकिन विवरण इसके कार्यान्वयन पर निर्भर करता है और यह अलग-अलग विकृतियों के लिए अलग है।
terdon

जवाबों:


1

कैसे इस बाश समाधान के बारे में?

#!/bin/bash

shopt -s nullglob extglob
for file in +([[:digit:]]).bil; do
    file_noext=${file%.bil}
    year=${file_noext::4}
    day=${file_noext:4}
    [[ -z $day ]] || ((0<=day && day<=152 && ${#year}==4)) || { echo "Error with file $file"; continue; }
    newname=$(date -d "$year-08-01 + $day days" '+%Y%m%d.bil')
    echo mv -nv "$file" "$newname"
done
  • यह फॉर्म की सभी फाइलों को लूप करेगा X.bil कहा पे X एक संख्या है (केवल अंकों से बना)।
  • प्रत्येक फ़ाइल के लिए और एक्सटेंशन अलग करने के बाद .bil, हम पहले चार अक्षर निकालते हैं ( year ) और हमें शेष अंक मिलते हैं day चर।
  • फिर एक लाइन है जो जांचती है कि क्या सब कुछ ठीक है ( day गैर-खाली है, 0 और 152 के बीच, और year वास्तव में 4 अक्षर हैं)।
  • उसके बाद हम उपयोग करते हैं date उपयोगिता (उम्मीद है कि आपके पास एक स्मार्ट है date मेरी तरह जो तिथियों के साथ अंकगणित कर सकता है, यहाँ दिए गए दिनों को जोड़ सकता है)।
  • अंत में हम नामकरण करते हैं (ठीक है, मैंने एक को छोड़ दिया echo सामने mv, ताकि आदेश केवल दिखाया गया है, प्रदर्शन नहीं किया गया है; हटाए echo अगर आप इससे खुश हैं)।

परीक्षा। मैंने इस स्क्रिप्ट को कॉल किया banana (उसके साथ echo निकाल दिया) और मैंने chmod +x banana। फिर:

$ mkdir scratch
$ cd scratch
$ touch 2011{0,42,100,151}.bil
$ ls
20110.bil  2011100.bil  2011151.bil  201142.bil
$ ./banana
`20110.bil' -> `20110801.bil'
`2011100.bil' -> `20111109.bil'
`2011151.bil' -> `20111230.bil'
`201142.bil' -> `20110912.bil'
$ ls
20110801.bil  20110912.bil  20111109.bil  20111230.bil

अछा लगता है!


आह, घने कोड, आह ... मैंने ऐसा क्यों नहीं सोचा?
MariusMatutiae

0

निम्नलिखित स्क्रिप्ट आपके लिए यह करेगी:

 #!/bin/bash


 > out.txt
 while read line; do
    mytmp=$(echo $line | sed 's/.bil$//' | sed 's/^2011//' )
    echo $mytmp
    if [ $mytmp -lt 31 ]; then
            MONTH=08
            DAY=$(( $mytmp + 1))
    elif  [ $mytmp -lt 61 ]; then
            MONTH=09
            DAY=$(( $mytmp - 30 ))
    elif  [ $mytmp -lt 92 ]; then
            MONTH=10
            DAY=$(( $mytmp - 60 ))
    elif  [ $mytmp -lt 122 ]; then
            MONTH=11
            DAY=$(( $mytmp - 91 ))
    elif  [ $mytmp -lt 153 ]; then
            MONTH=12
            DAY=$(( $mytmp -121 ))
    fi
    echo "2011$MONTH$DAY.bil" >> out.txt

 done < data

यह इस तरह काम करता है: यह नामक एक फाइल को पढ़ता है डेटा लाइन से लाइन, और एक फ़ाइल नामक में अपने उत्पादन डालता है out.txt (इसे बदलें क्योंकि यह आपको सबसे अच्छा लगता है)। पहली पंक्ति आउटपुट फ़ाइल को साफ़ करती है, फिर आरंभिक स्ट्रिंग को स्ट्रिप करते हुए डेटा फ़ाइल को पढ़ती है 2011 और फाइनल का .bil । जो बचा है, वह दिन का कोडिंग है। फिर, दिन कोडिंग के आधार पर, यह इसी महीने और दिन को निर्धारित करता है, और यह पूर्व-लंबित द्वारा स्ट्रिंग को फिर से संगठित करता है 2011 , अपील कर रहे हैं .bil , और फ़ाइल में अंतिम स्ट्रिंग डाल रहा है output.txt

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