पूरे डायरेक्टरी ट्री को लोअर-केस नामों में बदलें


12

मैं एक वेबसाइट रूपांतरण पर काम कर रहा हूँ। वेब सर्वर से लिंक और सेवा के रूप में फाइल केस असंवेदनशील थे। लेकिन, मैंने अपने लिनक्स सिस्टम पर साइट का एक डंप बनाया है और मैं डेटा माइग्रेट करने के लिए स्क्रिप्ट लिख रहा हूं। समस्या यह है कि मैं पृष्ठों में लिंक स्ट्रिंग्स और फ़ाइल सिस्टम पर वास्तविक शब्द मामले के बीच केस संवेदनशीलता समस्याओं में चल रहा हूं।

उदाहरण के लिए, किसी पृष्ठ में एक लिंक हो सकता है जैसे <a href='/subfolder/PageName.asp'>वास्तविक फ़ाइल /subfolder/pagename.asp। इसी तरह छवियों के साथ - <img src='spacer_sm.gif'>हो सकता है Spacer_Sm.gif

इसलिए मेरा विचार है कि सभी निर्देशिका और फ़ाइलनाम को साइट डाउनलोड के लिए उनके निचले-मामले समकक्ष में बदलना। मैं यह कैसे करूं (और बेहतर तरीका हो सकता है?)

यहां तक ​​कि अगर यूनिक्स कमांड्स हैं जिनके पास केस-इनसेंसिटिव स्विच हैं, तो मैं पीएचपी का उपयोग कर रहा हूं, इसलिए सभी फाइलसिस्टम कमांड में केस सेंसिटिविटी के विकल्प नहीं हैं।


2
एक समान पिछले प्रश्न देखें । मैंने यहाँ एक सरल उत्तर दिया है क्योंकि प्रश्न थोड़ा अधिक विशिष्ट है।
गिल्स एसओ- बुराई को रोकें '

जवाबों:


8

मुझे नहीं पता कि आपके यूनिक्स-स्वाद में ए है या नहीं rename। कई लिनक्स हैं, और यह एक पर्ल-पैकेज का हिस्सा है, यदि आप एक रिपॉजिटरी की खोज करते हैं।

find ./ -depth -exec rename -n 'y/[A-Z]/[a-z]/' {} ";"

इसके बाद के संस्करण के साथ

rename -n 

वास्तव में कार्रवाई नहीं करता है, लेकिन केवल प्रिंट करें कि क्या किया जाएगा। आप इसे वास्तविक के लिए करने के लिए -n छोड़ देते हैं।


क्या 'भाषा' या रेगेक्स 'y/[A-Z]/[a-z]/'हिस्सा है?
1539 पर user394

खैर, चूंकि renameएक perlपैकेज का हिस्सा है , मैं अनुमान लगाता हूं, लेकिन पैटर्न का उपयोग sedबहुत अधिक किया जाता है, और शायद में AWKभी। मैं केवल sedअच्छी तरह से जानता हूं । मैं अनुवाद yकरता हूं translateया mapकरता हूं, लेकिन मुझे नहीं पता कि चरित्र की उत्पत्ति कहां से हुई है।
उपयोगकर्ता अज्ञात

पर्ल रेगेक्स होना चाहिए - गिल्स अपने जवाब में कहते हैं कि renameयह एक पर्ल स्क्रिप्ट है।
user394

हां, और आप फ़ाइल नाम को संशोधित करने के लिए perl regexs का उपयोग कर सकते हैं, जो जरूरी नहीं कि पर्ल में लिखे जाने से समाप्त हो, लेकिन जो अधिक दिलचस्प प्रश्न हो सकता है।
उपयोगकर्ता अज्ञात

9

Zsh

zmv -o-i '(**/)(*)' '$1${2:l}'

स्पष्टीकरण: zmvदिए गए प्रतिस्थापन पाठ के अनुसार एक पैटर्न से मेल खाती फ़ाइलों का नाम बदल देता है। हुड के नीचे प्रत्येक कमांड -o-iका -iविकल्प पास करता है mv(नीचे देखें)। प्रतिस्थापन पाठ में $1, $2आदि, पैटर्न में क्रमिक कोष्ठक समूह हैं। **सभी (उप) * निर्देशिका का मतलब है, पुनरावर्ती। अंतिम (/)एक कोष्ठक समूह नहीं है, लेकिन केवल निर्देशिका से मेल खाने वाला एक ग्लोब क्वालीफायर अर्थ है। लोअरकेस में ${2:l}कनवर्ट करता $2है।

पर्ल का नाम बदला

यहाँ मैं पर्ल नाम और उबटन स्क्रिप्ट का उपयोग करता हूं जो डेबियन और उबंटू जहाज के रूप में /usr/bin/prename(आमतौर पर उपलब्ध है rename)। बैश b4 या zsh के साथ:

shopt -s globstar  # only in bash
rename 's!/([^/]*/?)$!\L/$1!' **/*

अन्य गोले के साथ:

find . -depth -exec rename -n 's!/([^/]*/?)$!\L/$1!' {} +

पोर्टेबल

रिकर्सिवली:

find . -depth -exec sh -c '
    t=${0%/*}/$(printf %s "${0##*/}" | tr "[:upper:]" "[:lower:]");
    [ "$t" = "$0" ] || mv -i "$0" "$t"
' {} \;

यह -depthसुनिश्चित करता है कि गहरी नेस्टेड निर्देशिकाओं को उनके पूर्वजों से पहले संसाधित किया जाता है।


1

यह निम्न निर्देशिका संरचना पर काम नहीं करता था:

JKL/
deF/
ABC/DEf
ABC/gHi
ghi/jkL

यहाँ एक उदाहरण है जो काम करता है:

for i in `find | sort -r | sed '$d'`; do \
   b=${i%/*}; e=${i##*/}; mv $i $b'/'${e,,}; done

bऔर evar पर स्पष्टीकरण के लिए :

man bash

फिर निम्नलिखित कुंजी अनुक्रम का उपयोग करें: /,,Enterbb


0

स्वीकृत उत्तर मेरे काम नहीं आया क्योंकि इसने सभी निर्देशिकाओं को एक बार में बदलने की कोशिश की थी। मुझे ग्लीस के ऊपर पोर्टेबल के समान स्टैटेक्सचेंज पर एक और समाधान मिला: बैरामिन से -
/programming/4268591/unix-rename-files-directories-to-uppercase

मैंने इसे यहाँ कॉपी किया है:

find . -depth | \
while read LONG; do
   SHORT=$( basename "$LONG" | tr '[:lower:]' '[:upper:]' )
   DIR=$( dirname "$LONG" )
   if [ "${LONG}" != "${DIR}/${SHORT}"  ]; then
     mv "${LONG}" "${DIR}/${SHORT}"
   fi
done

जिसके लिए मैंने tr कमांड को बदल दिया है: यानी sed s / cat / dog / g

किसी भी धन्यवाद ऊपर लिंक पर Baramin करने के लिए चला जाता है

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