2010-11-29 15 views
7

हम एक लिनक्स सर्वर पर उपversण चला रहे हैं। हमारे संगठन में कोई भी मिश्रित मामले के साथ 3k फ़ाइलों को ओवरराइट करता है जब उन्हें सभी को लोअरकेस की आवश्यकता होती है।मैं सबवर्सन में लोअरकेस में फाइलों का नाम कैसे बदल सकता हूं?

यह CLI

rename 'y/A-Z/a-z/' * 

में काम करता है लेकिन स्पष्ट रूप से तोड़फोड़ अप पेंच होगा।

svn rename 'y/A-Z/a-z/' * 

काम नहीं करता है क्योंकि सबवर्सन अलग-अलग नामों के साथ अलग-अलग व्यवहार करता है। तो मैं इसे बैच नौकरी के रूप में कैसे कर सकता हूं? मैं सीएलआई के साथ चूसता हूं, इसलिए कृपया इसे समझाएं जैसे मैं आपके माता-पिता हूं। सभी 3k फाइलों का नाम बदलना एक ऐसा काम नहीं है जिसे मैं करना चाहता हूं।

धन्यवाद

+0

मुझे आशा है कि इतिहास कोई मुद्दा नहीं है। आप इसे सब खो चुके हैं और नाम के बाद इसे फिर से खो देंगे। – jgifford25

+0

चिंता के लिए धन्यवाद लेकिन इतिहास कोई मुद्दा नहीं है, यह एक बाहरी विक्रेता से एचटीएमएल फाइलों का डंप है जिसे हम अभी भी त्रैमासिक आधार पर बदलते हैं। – invertedSpear

उत्तर

7
for src in *; do 
    dst=$(echo "$src" | tr '[A-Z]' '[a-z]') 
    [ "$src" = "$dst ] || svn rename "$src" "$dst" 
done 

यह कैसे काम करता:

  1. लूप स्रोत से अधिक फ़ाइल नाम।
  2. गंतव्य फ़ाइल नाम कम से कम स्रोत फ़ाइल नाम है। चरित्र चरित्र अनुवाद द्वारा चरित्र करता है।
  3. यदि स्रोत और गंतव्य फ़ाइल नाम समान हैं तो हम ठीक हैं, अन्यथा, svn नाम बदलें। आप इसके बजाय एक कथन का उपयोग कर सकते हैं, लेकिन || का उपयोग कर एक लाइनर सशर्त के लिए काफी आम है।

आप प्रत्यावर्तन की जरूरत है, तो आप एक छोटे से स्क्रिप्ट svn-lowername.sh (ऊपर के एक मामूली संस्करण) बना सकते हैं:

#!/bin/bash 
for src; do 
    dst=$(echo "$src" | tr '[A-Z]' '[a-z]') 
    [ "$src" = "$dst" ] || svn rename "$src" "$dst" 
done 

chmod +x svn-lowername.sh करना सुनिश्चित करें। तब निष्पादित करें:

find -name .svn -prune -o -type f -print0 | xargs -0 ./svn-lowername.sh 

आपको लगता है इस समस्या को फिर से हो सकता है, कहीं न कहीं अपनी राह में svn-lowername.sh भी छिपा सकते हैं (~/bin/ एक अच्छा स्थान हो सकता है) और आप तो ./ उपसर्ग खो सकते हैं जब यह चल रहा है।

आप भी इस तरह बस एक ही निर्देशिका पर svn-lowername.sh उपयोग कर सकते हैं:

./svn-lowername.sh * 
+0

'*' उपनिर्देशिकाओं के माध्यम से पुन: साझा नहीं करेगा, लेकिन @ invertedSpear का पहला उदाहरण करेगा जो करेगा। वह शायद 'ढूंढना चाहता है। या समान। – nmichaels

+0

@ नाथन: हाँ, मैंने रिकर्सन नहीं जोड़ा क्योंकि "यह काम" उदाहरण रिकर्सिव नहीं था। –

+0

धन्यवाद, आप सही रिकर्सन आवश्यक नहीं हैं लेकिन इसे उपलब्ध कराने के लिए धन्यवाद। – invertedSpear

1

इसमें कुछ समय hacky है, लेकिन नेस्ट निर्देशिका के किसी भी संख्या पर काम करना चाहिए:

find -mindepth 1 -name .svn -prune -o -print | (
    while read file; do 
     svn mv "$file" "`perl -e 'print lc(shift)' "$file"`" 
    done 
) 

इसके अलावा, आप बस अपनी प्रतिबद्धता वापस कर सकता है। सुराग-चार-चार का प्रशासन करना समझदार हो सकता है।

+0

अपनी प्रतिबद्धता को वापस नहीं कर सकता है यह एक बाहरी विक्रेता से अद्यतन में एक डंप था। तो priors तारीख दस्तावेजों से बाहर हैं। ओह और दोस्त भी छोड़ दिया, इसलिए मुझे इसे ठीक करना है। – invertedSpear

+1

यह बेहतर है क्योंकि यह निर्देशिका में सभी फ़ाइलों में '*' का विस्तार करने वाले खोल पर निर्भर नहीं है। यह बिना किसी चेतावनी के कमांड लाइन को अधिभारित कर सकता है। हां, कमांड लाइन बहुत बड़ी हैं, लेकिन जब ऐसा होता है, तो आपको आंशिक रूप से नामित फाइलों के सेट के साथ छोड़ दिया जाता है और कोई चेतावनी नहीं है कि कमांड ने उस कार्य को पूरा नहीं किया है। –

1

सबवर्सन में नामों को दो चरणों की आवश्यकता होती है, svn copy के बाद svn delete यदि आप इतिहास को बनाए रखना चाहते हैं। यदि आप svn move का उपयोग करते हैं तो आप फ़ाइल का इतिहास खो देंगे।

हालांकि यह उत्तर आपके प्रश्न के साथ मदद नहीं करता है, यह इसे फिर से होने में मदद करेगा। अपने सबवर्जन रिपोजिटरी पर अपने प्री-प्रतिबद्ध हुक में case-insenstive.py स्क्रिप्ट लागू करें। अगली बार जब कोई एक अलग केस के साथ फाइल जोड़ने की कोशिश करता है, तो पूर्व-प्रतिबद्ध हुक उन्हें नहीं देगा।

संबंधित मुद्दे