2011-01-21 12 views
10

मेरे पास निर्देशिकाओं के समूह में कुछ फ़ाइलें हैं जिनके पास एक प्रमुख बिंदु है और इस प्रकार वे छिपे हुए हैं। मैं इसे वापस करना चाहता हूं और अग्रणी बिंदु को पट्टी करना चाहता हूं।फ़ाइल नामों से स्ट्रिप अग्रणी डॉट

मैं निम्नलिखित के साथ असफल रहा था:

for file in `find files/ -type f`; 
do 
base=`basename $file` 
if [ `$base | cut -c1-2` = "." ]; 
then newname=`$base | cut -c2-`; 
dirs=`dirname $file`; 
echo $dirs/$newname; 
fi 
done 

कौन सा हालत बयान पर विफल रहता है:

[: =: unary operator expected 

इसके अलावा, कुछ फाइलों को उन में एक जगह है और फ़ाइल उन्हें विभाजन देता है।

किसी भी मदद की सराहना की जाएगी।

+0

जब आप कहते हैं कि 'इसे वापस करें', तो क्या आपका मतलब डॉट के बिना फ़ाइलों का नाम बदलें? – SiegeX

+0

हां, अग्रणी बिंदु – Radek

उत्तर

21

एक चर की शुरुआत से कुछ हटाने का सबसे आसान तरीका ${var#pattern} का उपयोग करना है।

$ FILENAME=.bashrc; echo "${FILENAME#.}" 
bashrc 
$ FILENAME=/etc/fstab; echo "${FILENAME#.}" 
/etc/fstab 

बैश आदमी पृष्ठ देखें:

$ {पैरामीटर # शब्द}
$ {पैरामीटर ## शब्द}

शब्द एक पैटर्न का उत्पादन करने के लिए विस्तारित किया गया है जैसे पथनाम विस्तार में। यदि पैटर्न पैरामीटर के मान की शुरुआत से मेल खाता है, तो विस्तार का परिणाम सबसे कम मिलान पैटर्न ('' '' केस) या सबसे लंबा मिलान पैटर्न ('##) के साथ पैरामीटर का विस्तारित मान है। 'केस) हटा दिया गया।

वैसे, अधिक चुनिंदा find कमांड के साथ आपको सभी कड़ी मेहनत करने की आवश्यकता नहीं है। आप हो सकता है find केवल एक प्रमुख बिंदु के साथ फ़ाइलों से मेल खाते हैं:

find files/ -type f -name '.*' 

फेंकने कि सब एक साथ है, तो:

find files/ -type f -name '.*' -printf '%P\0' | 
    while read -d $'\0' path; do 
     dir=$(dirname "$path") 
     file=$(basename "$path") 
     mv "$dir/$file" "$dir/${file#.}" 
    done 

अतिरिक्त नोट्स:

  1. ठीक से रिक्त स्थान के साथ फ़ाइल के नाम को संभालने के लिए जब आप उन्हें संदर्भित करते हैं तो आपको चर नामों को उद्धृत करने की आवश्यकता होती है। केवल $file के बजाय "$ फ़ाइल" लिखें।

  2. अतिरिक्त मजबूती के लिए डिलीमीटर के रूप में -printf '\0' और read -d $'\0' उपयोग NUL पात्रों तो भी नाम एम्बेडेड नई-पंक्तियों '\n' काम करेंगे के साथ फाइल।

6
find files/ -name '.*' -printf '%f\n'|while read f; do 
     mv "files/$f" "files/${f#.}" 
done 
2
  1. यह स्क्रिप्ट किसी भी फाइल आप इसे फेंक कर सकते हैं के साथ काम करता है, भले ही वे रिक्त स्थान, नई पंक्तियों या उनके नाम में अन्य नापाक अक्षर होते हैं।
  2. यह कोई फर्क नहीं पड़ता कि कितने उपनिर्देशिका गहरे छिपा फ़ाइल
  3. अन्य उत्तर के विपरीत है अब तक काम करता है आप ऐसा नहीं स्क्रिप्ट के बाकी को बदलने के लिए जब आप पथ find को दिया बदलने के लिए है

* नोट: मैंने echo शामिल किया ताकि आप इसे सूखी दौड़ की तरह जांच सकें। यदि आप परिणामों से संतुष्ट हैं तो सिंगल echo हटाएं।

find . -name '.*' -exec sh -c 'for arg; do d="${arg%/*}"; f=${arg:${#d}}; echo mv "$arg" "$d/${f#.}"; done' _ {} + 
+1

को पट्टी करें मुझे त्रुटि मिलती है '_: 1: _: खराब प्रतिस्थापन ' – k0pernikus

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