सीड के साथ उपयोग के लिए बैश स्क्रिप्ट में आगे की स्लैश से भागने से ठीक से


14

मैं उन फ़ाइलों के आकार को निर्धारित करने की कोशिश कर रहा हूं, जिन्हें सूखी मोड में rsync चलाकर दो फ़ोल्डरों को सिंक करने पर नई कॉपी की जाएगी और फिर rsync के आउटपुट में सूचीबद्ध फाइलों के आकार को संक्षेप में प्रस्तुत किया जाएगा।

वर्तमान में मैं उनके पैरेंट फोल्डर द्वारा फाइलों को उपसर्ग करने पर अटक गया हूं। मुझे पता चला कि कैसे sed का उपयोग करके लाइनों को उपसर्ग करना है और कैसे sed का उपयोग करके बचना है, लेकिन मुझे उन दोनों के संयोजन में परेशानी हो रही है।

यह है कि मैं कितनी दूर है:

source="/my/source/folder/"
target="/my/target/folder/"
escaped=`echo "$source" | sed -e 's/[\/&]/\\//g'`
du `rsync -ahnv $source $target | tail -n +2 | head -n -3 | sed "s/^/$escaped/"` | awk '{i+=$1} END {print i}'

यह मैं bash -x myscript.sh से प्राप्त आउटपुट है

+ source=/my/source/folder/
+ target=/my/target/folder
++ echo /my/source/folder/
++ sed -e 's/[\/&]/\//g'
+ escaped=/my/source/folder/
+ awk '{i+=$1} END {print i}'
++ rsync -ahnv /my/source/folder/ /my/target/folder/
++ sed 's/^//my/source/folder//'
++ head -n -3
++ tail -n +2
sed: -e expression #1, char 8: unknown option to `s'
+ du
80268

कैसे ठीक से भागने के लिए किसी भी विचार अत्यधिक सराहना की जाएगी।

जवाबों:


28

आप वास्तव में से बचने के साथ परेशान करने की जरूरत नहीं है /। से जीएनयू sedमैनुअल :

/वर्ण समान रूप से किसी भी भीतर किसी भी अन्य एकल चरित्र द्वारा बदले जा सकते sकमान।

उदाहरण के लिए:

echo 'foobar' | sed -e 's#foo#bar#'

आउटपुट देता है

barbar

4
यह मैन पेज में पहली बार होना चाहिए
स्पष्ट ''

किसी 'में' के रूप में *?
उज्ज्वल सिंह

0

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

$ find source
source
source/5832
source/5832/5832_1.png
source/5832/5832_2.png
source/5831
source/5831/5831_1.png
source/5830
source/5830/5830_3.png
source/5830/5830_1.png
source/5830/5830_2.png

आपको कहीं भी भागने की ज़रूरत नहीं है जितना आप कर रहे हैं। यहाँ में sed ब्लॉक निम्नलिखित करेगा:
1d; 'वृद्धिशील फ़ाइल सूची भेजने' की पहली पंक्ति हटाएं
/ ^ $ /, $ d; उस खाली सूची को हटा दें जो फ़ाइल सूची के अंत और उसके बाद सब कुछ का प्रतीक है।
// $ / d किसी '/' में समाप्त होने वाली किसी भी लाइन को हटा देता है, जो
कि डायरेक्ट्रीज़ होती हैं। ध्यान दें कि आप बैकस्लैश के साथ स्लैश से बच सकते हैं (वास्तविक प्रश्न का उत्तर देने के लिए)।

$ du $(rsync -ahnv source target | sed '1d;/^$/,$d;/\/$/d')
0   source/5830/5830_1.png
0   source/5830/5830_2.png
0   source/5830/5830_3.png
0   source/5831/5831_1.png
0   source/5832/5832_1.png
0   source/5832/5832_2.png

और अतिरिक्त बोनस अंक के लिए, आप परिणाम भी मिलान कर सकते हैं:

$ du -s $(rsync -ahnv source target | sed '1d;/^$/,$d;/\/$/d') | awk '{x+=$1;print $0} END {print "sum: "x}'
0   source/5830/5830_1.png
0   source/5830/5830_2.png
0   source/5830/5830_3.png
0   source/5831/5831_1.png
0   source/5832/5832_1.png
0   source/5832/5832_2.png
sum: 0

यदि आप निर्देशिका के साथ पहले से ही पूरी तरह से समन्वयित कर रहे हैं, तो यह हास्यास्पद परिणाम लौटाएगा, हालांकि:

76  .
sum: 76
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.