2009-12-02 14 views
5

मैं मैं नाम बदलने के लिए कोशिश कर रहा हूँ फ़ाइलों का एक बहुत कुछ है, मैं उन्हें मैच के लिए एक नियमित अभिव्यक्ति करने की कोशिश की है, लेकिन फिर भी है कि मैं फ़ाइलों पर अटक गया जैसे नाम हैं:मैं आसानी से पर्ल के साथ फ़ाइलों का नाम कैसे बदल सकता हूं?

फ़ाइल नाम 01

फ़ाइल नाम 100

फ़ाइल नाम 02

फ़ाइल नाम 03

आदि, मैं चाहते हैं एक dd एक "0" (शून्य), फ़ाइल के किसी भी है कि कम से कम 100 कर रहे हैं, इस तरह के पीछे:

फ़ाइल नाम 001

फ़ाइल नाम 100

फ़ाइल नाम 002

फ़ाइल नाम 003

मिलान करने के रूप में मुझे जितना निकटतम मिला, यह खोज-प्रकार डी का उपयोग कर रहा था। sort -r | grep '[1-9] [0-9] $' हालांकि मैं यह नहीं समझ सका कि उन्हें कैसे बदला जाए। किसी भी मदद के लिए अग्रिम धन्यवाद जो आप मुझे दे सकते हैं। सेंटोस पर आईएम अगर यह किसी भी मदद की है, तो यह सब एसएसएच के माध्यम से किया जा रहा है।

+0

अपने फ़ाइल नाम वास्तव में रिक्तियाँ हैं? –

+0

हां, वे ऐसा दिखते हैं: "फ़ाइल का नाम 01" "फ़ाइल का नाम 101" –

+1

क्या आप मशीन पर उपलब्ध "टूल्स" पर विस्तार कर सकते हैं? क्या आपके पास पर्ल, पायथन, रूबी या इसी तरह का स्थापित है? –

उत्तर

12
perl -e 'foreach $f (glob("File\\ Name*")) { $nf = $f; $nf =~ s/(\d+)$/sprintf("%03d",$1)/e; print `mv \"$f\" \"$nf\"`;}' 

शायद थोड़ा अधिक हो सकता है, लेकिन यह पूछा जाता है।

0

मुझे लगता है कि mmv आपका मित्र यहां है।

9
find . -type d -print0 | xargs -0 rename 's/(\d+)/sprintf "%03d", $1/e' 

या ऐसा ही कुछ है, बशर्ते

  1. आप है जीएनयू खोजने के लिए और जीएनयू xargs (-print0 और -0 के लिए)
  2. आप 'नाम बदलें' उपयोगिता है कि पर्ल के साथ आता है
  3. नहीं है है फ़ाइल नाम में अंकों का केवल एक समूह। यदि एक से अधिक हैं, तो आपको रेगेक्स के साथ कुछ करने की आवश्यकता है ताकि इसे केवल उस नंबर से मेल खाया जा सके जिसे आप सुधारना चाहते हैं।
+0

यह कुछ ऐसा है जो मैं सुझाव देने जा रहा था, xargs के बजाए sed का उपयोग करके, इसलिए मैं इसे +1 कर दूंगा। – shoover

+0

मुझे पता था कि xargs जाने का रास्ता था, मैं बस सटीक कमांड नहीं लिख सका। –

+0

+1 निर्भरताओं की सूची के लिए (संभवतः नाम बदलने वाली उपयोगिता जिसका आप उल्लेख कर रहे हैं वह एक यम या उपयुक्त है)। – ChristopheD

2

भागो दो आदेशों में इस क्रम में:

$ rename 's/File Name (\d)$/File Name 0$1/' * 
$ rename 's/File Name (\d\d)$/File Name 0$1/' * 

पहले एक सब कुछ 10 से कम नाम बदलता है और एक शून्य पहले जोड़ता। दूसरा एक 100 से कम सब कुछ का नाम बदलता है और शून्य तैयार करता है। परिणाम सभी फ़ाइल नामों के लिए तीन अंक होना चाहिए।

+0

वे वैध आदेश कौन से पर्यावरण हैं? –

+0

'नाम बदलें 'एक उपयोगिता है जो मानक पर्ल वितरण के साथ आता है। मैं इन्हें लिनक्स बैश के तहत चला गया। –

+0

[$ को कमांड प्रॉम्प्ट का प्रतिनिधित्व करना चाहिए।] –

0

आप पेर्ल या रूबी का उपयोग करके कुछ कर सकते हैं।

समान निर्देशिका

dirlisting = DIR.entries('.') 

dirListing.each do |file| 
num = file.match(/\d+$/).to_i 
if num < 100 
    find the position where start the number, with index and inject the 0 there. 
end 
end 
+0

आपको शायद यह उल्लेख करना चाहिए कि यह कोड रूबी है और –

+0

पर नहीं है यदि आप मेरी वाक्य पढ़ते हैं तो आपको "perl या ruby" –

+0

दिखाई देगा और इसलिए मैंने कहा कि आपको अव्यवस्थित करना चाहिए तथ्य यह है कि कोड रूबी है। –

4

इस एक बार की बात है में यह सब फाइलों डाल? यदि ऐसा है, तो मैं ऐसा कुछ सुझाव देने जा रहा हूं जो कई प्रोग्रामर द्वारा यहां एक पुलिस प्रतीत होता है:

फ़ाइल में अपने आदेश (find -type d | sort -r | grep ' [1-9][0-9]$') के आउटपुट को पाइप करें और कुछ वैश्विक खोज/प्रतिस्थापन के साथ एक संपादक का उपयोग करें एक स्क्रिप्ट बनाने के लिए जादू जो नाम बदलता है।

फिर स्क्रिप्ट को फेंक दें।

थोड़ा सा झगड़ा और थोड़ा सा मौका है कि आप अपने चालाक (लेकिन अपर्याप्त रूप से डीबग किए गए) एक-लाइनर पर कुछ प्रयास करके पैर में खुद को शूटिंग कर देंगे।

+0

++! कभी-कभी "गहरी जादू" सीखने के बजाय समझने वाले क्लेज का उपयोग करना बेहतर होता है। – daotoad

+0

+1 मुझे लगता है कि इस तरह की चीज अक्सर एक ऑफ आवश्यकता के लिए सबसे व्यावहारिक समाधान है –

+0

यह एक पुलिस-आउट हो सकता है, लेकिन यह एक सुरक्षित पुलिस-आउट है ... kudos। –

0
use strict; 
use File::Copy; 

my @files = glob 'File*Name*'; 

foreach my $filename (@files) { 
    if ($filename =~ m`^.*File.*Name.*?(\d+)`) { 
     my $number = $1; 
     next if ($number > 99); 
     rename $filename, sprintf("FileName%03d",$number); 
    } 
} 
+0

वह 'फ़ाइल नाम 100'' नाम का नाम फ़ाइल नाम 0100' है जिसका इरादा नहीं है। –

+0

आप निश्चित रूप से सही थे। इसे बनाने के लिए कुछ कोड जोड़ा गया है जो ऐसा नहीं होगा। –

1

मेरे डेबियन में यह 300 फाइलों के साथ परीक्षण के साथ अच्छी तरह से काम करता है।

perl -e 'map `touch door$_.txt`, 1..300;' 
rename 's/(\d+)\.txt/sprintf("%03d.txt", $1)/e' *.txt 
0

for i in File*; 
do 
    case "${i##* }" in [0-9][0-9]) 
     echo mv "$i" "${i% *} $(printf "%03d" ${i##* })" ;; 
    esac; 
done 

निकालें "गूंज" वास्तविक नाम करने के लिए करता है, तो अपने रिमोट बैश खोल है

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