bash - फ़ाइल प्रबंधन के लिए स्क्रिप्टिंग फ़ाइलों की बहुत बड़ी संख्या के साथ




macos perl (2)

नाम को ठीक करने के लिए एक फ़ंक्शन बनाएं:

$ function fixname() { file="$1"; newname=$( echo "$file" | sed "s/sync-conflict.*\.jpg$/.jpg/" );  if [ -f "$newname" -a ! -s "$newname" ]; then mv "$file" "$newname"; fi; }

या, थोड़ा सा फैल गया:

function fixname() {
    file="$1"
    newname=$( echo "$file" | sed "s/sync-conflict.*\.jpg$/.jpg/" )
    # If empty file exists
    if [ -f "$newname" -a ! -s "$newname" ]; then
        mv "$file" "$newname"
    fi
}

फ़ंक्शन निर्यात करें:

$ export -f fixname

फ़ंक्शन निष्पादित करने के लिए ढूंढें चलाएं:

$ find . -type f -name \*sync-conflict\*.jpg -exec bash -c 'fixname {}' bash \;

चेतावनी: यह फ़ाइल नामों में रिक्त स्थान या कायरता वर्णों के साथ काम नहीं करेगा।

मेरे पास एक तीन OSX मशीन सेटअप है जो साझा ड्राइव को दूरस्थ रूप से सिंक्रनाइज़ रखने के लिए समन्वयन का उपयोग कर रहा था। किसी ने कुछ गलतियां कीं और बहुत सारी फाइलों को पुनः नाम दिया गया।

इसलिए इस पूरे ड्राइव पर मुझे ऐसी स्थितियां हैं जहां नाम 0KB आकार की फ़ाइल है, उदाहरण के लिए, file.jpg और file.sync-confilct201705-4528.jpg नामक वास्तविक आकार के साथ दूसरी फ़ाइल। मुझे पूरी ड्राइव को बार-बार खोजने की जरूरत है और जब मुझे इसमें सिंक-संघर्ष स्ट्रिंग वाला एक फ़ाइल मिलती है, तो यह देखने के लिए कि क्या 0KB के आकार के साथ 'सिंक-संघर्ष' स्ट्रिंग के बिना एक ही फाइल है अगर वहाँ है, तो मुझे 0KB फ़ाइल अधिलेखित करने के लिए सिंक-संघर्ष फ़ाइल का नाम बदलने की आवश्यकता है।

मैंने इसे एक बाश स्क्रिप्ट या पर्ल स्क्रिप्ट के साथ निपटने पर विचार किया है। बैश का उपयोग करना मुझे लगता है कि 'find' कमांड का उपयोग करके-regex के साथ मुझे शुरू होगा, लेकिन मुझे वाकई पता नहीं है कि परिणामों को कैसे संसाधित करें और अगले खोज परीक्षण को चलाएं। मैं पढ़ रहा हूं और इस पर काम कर रहा हूं।

पर्ल के साथ एक ही समस्या मैं फाइल :: खोज: का उपयोग करके पहले चरण के माध्यम से प्राप्त कर सकता हूं और फाइलों को फ़िल्टर करने के लिए मुझे regex का उपयोग करने की ज़रूरत का चयन कर सकता हूं, लेकिन फिर से मैं अगले चरण पर जा रहा हूं, जो मूल निर्देशिका को उसी निर्देशिका में खोज रहा होगा और आवश्यक फ़ाइल चाल समारोह प्रदर्शन।

इन दोनों मामलों में मैं समय निकालने के लिए तैयार हूं, लेकिन मुझे आश्चर्य है कि कैदियों को क्या होगा? क्या इन दोनों परिस्थितियों में अपवाद के बिना बड़ी संख्या में फाइलों की पुनरावृत्ति हो सकती है? क्या शायद कोई बेहतर तरीका किसी की सिफारिश कर सकता है?


find बहुत अच्छा है लेकिन जैसा कि आपने नोट किया है, आपको अधिक की आवश्यकता है।

इस परिदृश्य में आप क्या find सकते हैं फिर से बारी-बारी से खोजते हैं और कुछ नतीजों से मिलान करने की क्षमता है जैसा कि बैश संस्करण 4 के रूप में होता है, आप इसे खोल में सही कर सकते हैं।

(ध्यान दें कि मैकोज़ जहाज़ संस्करण 3 के साथ है, इसलिए इस समाधान के लिए आपको मैप्स , होमब्रे या फिंक से बाश 4 इंस्टॉल करने की आवश्यकता होगी।)

$ shopt -s globstar nullglob
$ for file in **/*sync-confilct2017*.*; do echo mv -v "$file" "${file%sync-conf*}${file##*.}"; done
mv -v file.sync-confilct201705-4528.jpg file.jpg
mv -v foo/bar.sync-confilct201705-4528.ext foo/bar.ext

आप वास्तव में mv कमांड चलाने के लिए echo को निकाल सकते हैं।

जिस तरह से यह काम करता है वह है कि डबल एस्टीरिस्क, ** , का प्रयोग बाश द्वारा किया जाता है * हम "लक्ष्य" फ़ाइल नाम का निर्माण करने के लिए हम चाहते हैं कि फ़ाइल नाम के भागों को पट्टी करने के लिए पैरामीटर विस्तार का उपयोग कर रहे हैं।





rename