2011-08-09 20 views
9

मैं प्रतिलिपि बनाने और निर्देशिका से सभी फ़ाइलों का नाम बदलना चाहता हूं।बैच प्रतिलिपि बनाएँ और कई फ़ाइलों का नाम बदलें

मैं कुछ इस तरह है:

/dir/subdir/file.aa 
/dir/subdir/fileb.aa 
/dir/filec.aa 

और चाहते हैं सभी फाइलों को इस रूप में कॉपी करने के लिए:

/newdir/1.xx 
/newdir/2.xx 
/newdir/3.xx 
/newdir/4.xx 

.. /newdir/nn.xx

कैसे कर सकते हैं मैं इसे बाश में करता हूँ?

उत्तर

3

sth का प्रयास करें। इस तरह:

num=0 
for i in `find -name "*.aa"`; do 
    let num=num+1 
    cp $i newdir/$lc.xx 
done 
+0

धन्यवाद, बजाय num = संख्या + 1 का उपयोग का उपयोग करने के लिए मैं num = $ था ((संख्या +1))। –

+1

यह समाधान सभी फ़ाइल नामों को जिस तरह से होना चाहिए उसे संभाल नहीं करता है। अगर किसी फ़ाइल में कोई स्थान या समान है, तो यह विफल हो जाता है। – glglgl

+1

'num = $ ((num + 1)) के बजाय, आप बस' ((num ++)) 'कर सकते हैं। – norcalli

4
find -name "*.aa" | cat -n | while read n f; do 
    cp "$f" newdir/"$n".xx 
done 

(लगभग) किसी भी मान्य फ़ाइल नाम (छोड़कर अगर आप इसे में नई-पंक्तियों, जो साथ ही अनुमति दी जाएगी है) के साथ काम करेंगे।

आप खोल तक ही सीमित नहीं रहे हैं, तो अजगर में एक और समाधान हो सकता है

#!/usr/bin/env python 

if __name__ == '__main__': 
    import sys 
    import os 
    import shutil 
    target = sys.argv[1] 
    for num, source in enumerate(sys.argv[2:]): 
     shutil.move(source, os.path.join(target, "%d.xx" % num)) 

जो तब के रूप में

<script name> newdir *.aa 
+1

बेहतर समाधान। – ypnos

0

मैं इस जवाब देने की कोशिश करेंगे कहा जा सकता है, लेकिन यह नहीं हो सकता है इष्टतम समाधान हो, क्योंकि ऐसे कई उपकरण हैं जिनका उपयोग इस के लिए किया जा सकता है।

इस समस्या को हल करने का मेरा तरीका एक फ़ंक्शन लिखना होगा और फिर निर्देशिका/उपनिर्देशिका में प्रत्येक फ़ाइल को यह फ़ंक्शन लागू करना होगा। यह मानते हुए कि आपके पास एकाधिक कोर/प्रोसेसर हैं और यह कि आपका फ़ंक्शन केवल नाम बदलने और फ़ाइलों की प्रतिलिपि बनाने से अधिक CPU उपभोग करने वाला होगा, आप कार्य को समानांतर भी करेंगे।

बैश स्क्रिप्ट इस प्रकार दिखाई देगा:

#! /bin/bash 
n=1 
CopyAndRename() { 
    NEWNAME=$n.xx 
    cp "$i" /newdir/$NEWNAME 
    n=$[$n+1] 
} 

IFS=$'\n' 
LIST=`find /dir -type f` 

for i in $LIST; do 
    CopyAndRename $i 
done 

यह भी व्हाइटस्पेस और अन्य विशेष वर्ण के साथ फ़ाइल नामों को संभाल चाहिए। साथ में चलाना के लिए आप एक कार्यक्रम prll इस्तेमाल कर सकते हैं और फिर

prll CopyAndRename $LIST 

साथ पाश के लिए जगह ले लेकिन यह वास्तव में नाम और नकल के लिए आवश्यक नहीं है।

0

जीएनयू समानांतर यह इस तरह दिखेगा का उपयोग करना:

find ... | parallel cp {} /newdir/{#}.xx 

यह जो नकल में तेजी लाने के कर सकते हैं (प्रति कोर एक नौकरी) समानांतर में यह कर देगा - अपने भंडारण प्रणाली के आधार पर।

जीएनयू समानांतर एक सामान्य समांतरता है और उसी मशीन पर समानांतर में या कई मशीनों पर नौकरियां चलाने में आसान बनाता है जिनके पास आपके पास एसएसएच पहुंच है।

Simple scheduling

जीएनयू समानांतर बजाय एक नई प्रक्रिया जब spawns:

आप 32 विभिन्न नौकरियों आप 4 सीपीयू पर चलाना चाहते हैं, तो parallelize करने के लिए एक सीधे आगे रास्ता प्रत्येक CPU पर 8 नौकरियों को चलाने के लिए है एक खत्म - सीपीयू सक्रिय रखने और समय इस प्रकार की बचत:

GNU Parallel scheduling

स्थापना

यदि आपके वितरण के लिए जीएनयू समानांतर पैक नहीं किया गया है, तो आप व्यक्तिगत स्थापना कर सकते हैं, जिसके लिए रूट पहुंच की आवश्यकता नहीं है। यह 10 सेकंड में ऐसा करके किया जा सकता है:

(wget -O - pi.dk/3 || curl pi.dk/3/ || fetch -o - http://pi.dk/3) | bash 

के लिए अन्य स्थापना विकल्पों को देखने के http://git.savannah.gnu.org/cgit/parallel.git/tree/README

जानें

अधिक उदाहरण देखें: http://www.gnu.org/software/parallel/man.html

घड़ी परिचय वीडियो: https://www.youtube.com/playlist?list=PL284C9FF2488BC6D1

टी के माध्यम से चलना वह ट्यूटोरियल: http://www.gnu.org/software/parallel/parallel_tutorial.html

साइन अप करें ईमेल सूची के लिए समर्थन प्राप्त करने के: https://lists.gnu.org/mailman/listinfo/parallel

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