2013-02-21 71 views
8

यह अपेक्षाकृत मामूली होना चाहिए लेकिन मैं बिना किसी किस्मत के कुछ समय की कोशिश कर रहा हूं। मेरे पास एक निर्देशिका है, जिसमें कई निर्देशिकाएं हैं, जिनमें से प्रत्येक अपनी संरचना और फाइलों के साथ है।फाइलें खोजें, जगह में नाम बदलें यूनिक्स बैश

मैं सभी .java फ़ाइलों को निर्देशिका निर्देशिका के तहत किसी भी निर्देशिका में ढूंढना चाहता हूं, और उन्हें किसी विशेष नाम पर नामित करना चाहता हूं। उदाहरण के लिए, मैं सभी जावा फाइलों का नाम देना चाहूंगा "test.java"।

तो निर्देशिका संरचना है:

./files/abc/src/abc.java 
./files/eee/src/foo.java 
./files/roo/src/jam.java 

मैं बस करने के लिए नाम बदलना चाहते हैं:

./files/abc/src/test.java 
./files/eee/src/test.java 
./files/roo/src/test.java 

बेशक, मेरी समस्या का हिस्सा पथ में रिक्त स्थान हो सकता है मैं डॉन। फ़ाइल के अंदर कक्षाओं या कुछ भी नाम बदलने के बारे में चिंता करने की ज़रूरत नहीं है, बस फाइल का नाम जगह पर है।

यदि निर्देशिका में 1 से अधिक .java फ़ाइल है, तो मुझे कोई फर्क नहीं पड़ता कि यह ओवरराइट किया गया है या यह चुनने के लिए एक संकेत दिया गया है कि क्या करना है (या तो ठीक है, यह संभावना नहीं है कि 1 से अधिक हैं प्रत्येक निर्देशिका

मैं क्या कोशिश की है में:।

mv में देख रहे हैं और पाते हैं, लेकिन जब मैं उन्हें एक साथ पाइप मैं गलत कर रहा हो रहे हैं, मैं उन्हें अपने वर्तमान स्थान में रखने के लिए यह सुनिश्चित करना चाहते हैं और नाम बदलें, और आगे बढ़ें।

धन्यवाद, मैं वास्तव में किसी भी मदद की सराहना करता हूं।

उत्तर

21

find का जीएनयू संस्करण -execdir क्रिया है जो फ़ाइल को कहीं भी निर्देशिका में बदलता है।

find . -name '*.java' -exec bash -c 'mv "$1" "${1%/*}"/test.java' -- {} \; 
+0

मुझे '$ {1%/*}"/test.java' बिट को कैसे पढ़ा जाना चाहिए? – dumbledad

+1

परिवर्तनीय '$ 1','% 'सबसे छोटा मिलान प्रत्यय'/* 'हटा देता है - यह फ़ाइल नाम को '$ 1'' से' dirname "$ 1" जैसा करता है। '/ test.java' उस निर्देशिका नाम में जोड़ा गया है। –

5

अपने find आदेश (मेरे जैसे) -execdir का समर्थन नहीं करता है, तो निम्न प्रयास करें:

find . -name '*.java' -execdir mv {} test.java \; 

find के अपने संस्करण तो -execdir समर्थन नहीं करता है आप काम के साथ कार्य पूर्ण कर सकें :

find . -name "*.java" -exec bash -c 'mv "{}" "$(dirname "{}")"/test.java' \; 
+0

यह उद्धरण चिह्नों के साथ फ़ाइल नामों के लिए सुरक्षित होगा: '-exec bash -c' mv "$ 1" $ (dirname "$ 1")/test.java '- {} \; ' –