সেডের সাহায্যে ব্যাশ স্ক্রিপ্টে যথাযথভাবে ফরোয়ার্ড স্ল্যাশ থেকে রক্ষা পাওয়া


14

আমি শুকনো মোডে আরএসসিএনকি চালিয়ে দুটি ফোল্ডার সিঙ্ক করার সময় আরএসসিঙ্কের আউটপুটে তালিকাভুক্ত ফাইলের আকারগুলির সংমিশ্রণ করার সময় যে ফাইলগুলি নতুনভাবে অনুলিপি করা হবে সেগুলি নির্ধারণ করার চেষ্টা করছি।

বর্তমানে আমি তাদের মূল ফোল্ডারে ফাইলগুলি উপসর্গ করতে আটকে আছি। আমি শেড ব্যবহার করে কীভাবে লাইনগুলির উপসীকরণ করতে পারি এবং সেড ব্যবহার করে কীভাবে পালানো যায় তা আমি খুঁজে পেয়েছি তবে এই দুটিটি একত্রিত করতে আমার সমস্যা হচ্ছে troubles

এই যে আমি এতদূর পেয়েছি:

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


'কোনও' * এর মতো কোনও?
উজ্জ্বল সিং

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

আপনি যতটা করছেন তার কাছাকাছি কোথাও পালানোর দরকার নেই। এখানে সেড ব্লক নিম্নলিখিতগুলি করবে:
1 ডি; 'ইনক্রিমেন্টাল ফাইল তালিকা প্রেরণ'
/ ^ $ /, $ 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
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.