2011-07-20 14 views
146

मैं खोजने के लिए और मेरी साइट के रूट में सभी फाइलों में 'नारंगी' के साथ 'सेब' की सभी घटनाओं को बदलने के लिए इस आदेश को चलाने में sed के साथ बदलें:का पता लगाएं और निर्देशिका और उप निर्देशिकाओं

find ./ -exec sed -i 's/apple/orange/g' {} \; 

लेकिन यह नहीं करता है उप निर्देशिकाओं के माध्यम से जाना नहीं है।

इस आदेश के साथ क्या गलत है?

संपादित:

find ./ -type f -exec sed -i -e 's/apple/orange/g' {} \; 
+0

आप चलाने के 'मिल सकता है /' और कुछ नमूना उत्पादन पोस्ट:

sed -i 's/textSerch/textReplace/g' namefile 

अगर "sed" कोशिश काम नहीं? और निर्देशिका strucuture कृपया। संपादित करें: धन्यवाद! – Jacob

+0

एचएम आपकी खोज सही है, मेरे लिए subdirs के साथ काम करता है। – Jacob

+1

आप कैसे जानते हैं कि यह उपनिर्देशिका को संसाधित नहीं करता है? – carlpett

उत्तर

258

आपका खोजने कि तरह लग रहे निर्देशिका नाम भेजने से बचने का चाहिए sed करने के लिए: यहाँ ./ आदेश को खोजने के उत्पादन की कुछ पंक्तियाँ है :

find ./ -type f -exec sed -i '' 's#NEEDLE#REPLACEMENT#' *.php {} \; 
+10

इस काम को करने के लिए आपको 'sed -i'/सेब/नारंगी/g'' 'sed -i' 's/apple/orange/g'' में बदलने की आवश्यकता हो सकती है। – paulmelnikow

+4

'-i' एक तर्क लेता है: अस्थायी फ़ाइल को सहेजने के लिए उपयोग किया गया एक्सटेंशन। जीएनयू sed में, ऐसा लगता है कि '-i' और इसके तर्क के बीच कोई जगह नहीं है, लेकिन बीएसडी में वहां है ... इसलिए बीएसडी' -i ''/foo/bar/''जीएनयू' -i के बराबर है/foo/बार/'। – paulmelnikow

+13

असल में '-e' जोड़ना मैक ओएस पर काम नहीं करता है। उपरोक्त आदेश के बाद एक बी सी डी ई स्पर्श करें, इस तरह की निर्देशिका सूची तैयार करता है: 'a-e b b-e c c-e d d-e e e-e'। – paulmelnikow

5

यह मेरे लिए काम किया:

./index.php 
./header.php 
./fpd 
./fpd/font 
./fpd/font/desktop.ini 
./fpd/font/courier.php 
./fpd/font/symbol.php 
1

मुझे लगता है कि हम एक पंक्ति सरल कमांड के साथ ऐसा कर सकते हैं

for i in `grep -rl eth0 . 2> /dev/null`; do sed -i ‘s/eth0/eth1/’ $i; done 

इस page का संदर्भ लें।

+1

http: // mywiki.wooledge.org/DontReadLinesWithFor – tripleee

47

बड़े एस & आर कार्यों के लिए यह grep और xargs का उपयोग करने के लिए बेहतर और तेज़ है, उदाहरण के लिए;

grep -rl 'apples' /dir_to_search_under | xargs sed -i 's/apples/oranges/g' 
+9

इस उत्तर के लिए धन्यवाद, यह बहुत उपयोगी था! यदि एक गिट भंडार में, यह 'git grep -l' सेब 'का उपयोग करके भी तेज़ है xargs sed -i/सेब/संतरे/g'' – mrodrigues

-3

linuxOS में:।

perl -i -pe 's/textSerch/textReplace/g' namefile 
+2

वह उप निर्देशिकाओं में सभी फ़ाइलों को ढूंढना चाहता है जिसमें स्ट्रिंग और प्रतिस्थापन है, न केवल एक फ़ाइल –

0
grep -e apple your_site_root/**/*.* -s -l | xargs sed -i "" "s|apple|orage|" 
संबंधित मुद्दे