मैं खोज परिणामों को बदलने और cp के परिणामों को पास करने के लिए sed का उपयोग कैसे कर सकता हूं?


5

सोलारिस में, मैं फाइंड कमांड द्वारा मिली सभी फाइलों को थोड़े अलग रास्ते पर कॉपी करना चाहूंगा। निम्न स्क्रिप्ट मूल रूप से प्रत्येक फ़ाइल के लिए cp निष्पादित करती है जिसे ढूंढा गया है। उदाहरण के लिए:

cp ./content/english/activity1_compressed.swf ./content/spanish/activity1_compressed.swf
cp ./content/english/activity2_compressed.swf ./content/spanish/activity2_compressed.swf
...

#!/bin/bash

# Read all file names into an array
FilesArray=($(find "." -name "*_compressed.swf"))

# Get length of an array
FilesIndex=${#FilesArray[@]}

# Copy each file from english to spanish folder
# Ex: cp ./english/activity_compressed.swf ./spanish/activity_compressed.swf
for (( i=0; i<${FilesIndex}; i++ ));
do
    source="${FilesArray[$i]}"

    # Replace "english" with "spanish" in path  
    destination="$(echo "${source}" | sed 's/english/spanish/')"

    cp "${source}" "${destination}"
done

exit 0;

यह थोड़ा बहुत लगता है और मुझे आश्चर्य है कि एक ही चीज़ को प्राप्त करने के लिए खोज और सीपी कमांड के साथ इन-लाइन का उपयोग कैसे करें। मैं निम्नलिखित की तरह कुछ के लिए उम्मीद है, लेकिन जाहिरा तौर पर कोष्ठक आपरेशन के बदलते क्रम की स्वीकार्य विधि नहीं कर रहे हैं:

find . -name *_compressed -exec cp {} (echo '{}' | sed 's/english/spanish/')

1
उपयोग करने के लिए +1 $() बैकटिक्स के बजाय।
Dennis Williamson

जवाबों:


7

आसान तरीके हैं, लेकिन पोर्टेबिलिटी की खातिर हम थोड़े से फोर्किंग और बैकटिक्स का उपयोग कर सकते हैं:

find . -name *_compressed -exec sh -c 'cp {} `echo {} | sed 's/english/spanish/'`' \;

महान! +1 शैल पागल! : D क्या आप मेरे द्वारा बताए जा रहे आसान तरीकों के बारे में कुछ संकेत दे सकते हैं? हो सकता है कि वे तरीके भी उस उद्देश्य को बेहतर ढंग से पूरा करते हों।
dag729

2
मुझे उसके सटीक वातावरण पर यकीन नहीं है, लेकिन यदि सभी फाइलें केवल 1 डायरेक्टरी में हैं, तो वह कर सकता है cd वहाँ तो बस cp *_compressed.swf ../spanish
John T

मैं भी ऐसा ही सोच रहा था, लेकिन वहाँ 'cding' के बजाय वह सिर्फ 'cp' को ही टार्गेट डायरेक्टरी दे सकता है।
akira

जब मैं OS X पर एक टेस्ट रन करता हूं, -exec sh -c 'cp {} ... काम करता है, लेकिन अगर मैं सोलारिस पर चलता हूं ... सुरक्षा के लिए गूंज के साथ cp की जगह। आउटपुट "{}" है मैं अनुमान लगा रहा हूं कि -exec sh -c सोलारिस पर काम नहीं करता है।
Michael Prescott

@ जॉन टी: सभी फाइलें 1 डायरेक्टरी में नहीं हैं।
Michael Prescott

1

मैं बैकटिक का उपयोग करूंगा: आप इस पर और पाएंगे यहाँ (बैकटेक अध्याय 3.4.5 पर है)।

मूल रूप से जब आप backticks के बीच एक कमांड को जोड़ते हैं तो कमांड अपने आप उसके आउटपुट में प्रतिस्थापित हो जाएगी।


1
$ (COMMAND) और COMMAND उसी आउटपुट में परिणाम।
akira
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.