আমি লুপের জন্য একটি ব্যবহার করে একটি প্রকল্প ডিরেক্টরিতে সমস্ত হেডার ফাইল এবং উত্স ফাইলগুলিতে একটি লাইসেন্স শিরোনাম যুক্ত করার চেষ্টা করছি। এটি কাজ করছে না, অন্য কোনও পদ্ধতি ব্যবহার করছে sed
?
আমি লুপের জন্য একটি ব্যবহার করে একটি প্রকল্প ডিরেক্টরিতে সমস্ত হেডার ফাইল এবং উত্স ফাইলগুলিতে একটি লাইসেন্স শিরোনাম যুক্ত করার চেষ্টা করছি। এটি কাজ করছে না, অন্য কোনও পদ্ধতি ব্যবহার করছে sed
?
উত্তর:
for f in **/*.cpp; do
cat header_file $f > $f.new
mv $f.new $f
done
globstar
কাজ করার জন্য আপনাকে ব্যাশ চালু করতে হবে ।
এটি কমবেশি ড্যানিয়েল সেরোদিও'র উত্তরের একটি বর্ধিত ভাষ্য । আমি এটিকে একটি মন্তব্য হিসাবে রাইটটিং করা শুরু করেছি, তবে এটি খুব দ্রুত বেড়েছে ...
বাশ গ্লোব পুনরাবৃত্ত হওয়ার জন্য এটি প্রয়োজন shopt -s globstar
। আপনাকে অবশ্যই গ্লোবস্টার সক্ষম করতে হবে, অন্যথায় **
এটি কাজ করে না। গ্লোবস্টারের শেল বিকল্পটি ব্যাশের 4 সংস্করণে উপস্থিত হয়েছিল।
যেমন কোনও ডিরেক্টরি প্রক্রিয়াজাতকরণ এড়ানোর my.cpp/
জন্য, পরীক্ষাটি ব্যবহার করুন [[ -f $f ]]
... যখন পরীক্ষাটি ডাবল স্কোয়ার-বন্ধনীতে থাকে তখন ভেরিয়েবলগুলিকে ডাবল কোট করা দরকার হয় না।
আপনি ব্যবহার করে কোনও মিলে যাওয়া ফাইলের সম্ভাবনাও বিবেচনা করতে পারেন shopt -s nullglob
, যা কোনও ফাইলের সাথে মেলে না এমন নিদর্শনগুলিকে নিজের পরিবর্তে নাল স্ট্রিংয়ে প্রসারিত করতে দেয়।
একাধিক নিদর্শন হ্যান্ডেল করার জন্য, আপনাকে উল্লিখিত glob নিদর্শন চেইন পারেন: **/*.cpp **/*.h
কিন্তু সম্ভবত preferrably যখন শেল বিকল্প extglob হয় উপর মাধ্যমে shopt -s extglob
, আপনি এই ধরনের নির্মান যেমন ব্যবহার করতে পারেন **/*.@(cpp|h)
যা ফাইল সিস্টেম বেশি একাধিক পাস এড়াতে; একবার প্রতিটি প্যাটার্ন জন্য।
আপনি যদি .files
অন্তর্ভুক্ত হতে চান তবে ব্যবহার করুন .*.cpp
ইত্যাদি useshopt -s dotglob
পাইপ করা হচ্ছে এমন কোনও ফাইলকে নিরাপদে পরিচালনা করতে, sponge
প্যাকেজ থেকে ব্যবহার করুন moreutils
(এটি আপনাকে নিজের টেম্প ফাইল তৈরির প্রয়োজনীয়তা সংরক্ষণ করে)
printf "// The License\n\n" > /tmp/$USER-license
shopt -s globstar nullglob extglob
for f in **/*.@(cpp|h) ;do
[[ -f $f ]] && cat "/tmp/$USER-license" "$f" | sponge "$f"
done
[[
চূড়ান্তভাবে একটি নাল পরিচালনা করতে পারে $f
।
unset x; [ -f $x ] && echo exists
রিপোর্টগুলি "বিদ্যমান" ... (স্থির)
**/*.@(cpp|h)
সঙ্গে$( find . -name "*.h" -name "*.cpp")
আপনাকে @ ফ্রেড, @ ম্যাক্সম্যাকি, @ এঞ্জোটিব ধন্যবাদ।
আপনি কি দয়া করে আমি অনুসরণ করা পদ্ধতিটি চেক করতে পারেন?
#!/bin/sh
# script to copy the headers to all the source files and header files
for f in *.cpp; do
if (grep Copyright $f);then
echo "No need to copy the License Header to $f"
else
cat license.txt $f > $f.new
mv $f.new $f
echo "License Header copied to $f"
fi
done
অন্যথায় লাইসেন্স শিরোনাম একাধিকবার অনুলিপি করা হবে।
প্রকল্পের ডিরেক্টরি এবং উপ-ডিরেক্টরিতে সমস্ত শিরোনাম এবং উত্সগুলি দেখতে দয়া করে আমাকে একটি প্যাটার্ন প্রস্তাব করুন।
@ ফ্রেড কী পরামর্শ দিয়েছে তা আমি পুরোপুরি বুঝতে পারি নি।
targln=2; findln=$(sed -rne $targln'{\|// Copyright|=;q}' "$f"); if ((findln==targln));then
... তবে, অবশ্যই, সর্বোপরি এবং সর্বোপরি, প্রথমে এটি ভালভাবে পরীক্ষা করুন ... পিএস PS এখানে ইউনিক্স এবং লিনাক্সের কোর্সের পক্ষে আপনার মূল প্রশ্নে এই জাতীয় অতিরিক্ত পোস্ট করা উত্তর হিসাবে নয় ...
grep
, এতে -q
বিকল্প যুক্ত করুন grep
। সর্বদা চারপাশে ডাবল উদ্ধৃতি যুক্ত করুন $f
।
আপনি এটি করতে পারেন ex
বা ed
আপনি যদি পছন্দ করেন (আপনার sed
অনুরোধ অনুসারে sed
এটি করা উচিত নয় , স্ট্রিমগুলি সম্পাদনা করার জন্য ডিজাইন করা হয়েছে, -i
বিভিন্ন কারণে এটি একটি খারাপ ধারণা):
shopt -s globstar
for _file in **/*.@(cpp|h); do
ed -s "${_file}" << EOF
0a
/* This file is licensed under the foo license.
All copyright strictly enforced by the copyright monster. */
.
w
EOF
done
sed -i
খারাপ ধারণা কেন ?
sed -i
প্রতীক এবং হার্ডলিঙ্কগুলি ভেঙে দেয়, যার ফলে অপ্রত্যাশিত আচরণ হয়। সর্বোপরি এটি স্বজ্ঞাত নয়, আরও খারাপভাবে এটি সক্রিয়ভাবে ক্ষতিকারক।
#!/bin/bash
for i in `find . -name '*.[m|h]'` # or whatever other pattern...
do
echo $i
if ! grep -q Copyright $i
then
cat copyright.txt $i >$i.new && mv $i.new $i
fi
done
enter code here
জেরহার্ড গ্যাপমিয়ারের ব্লগ - হাওটো পুনরাবৃত্তভাবে উত্স ফাইলগুলির ফাইল শিরোনামগুলি প্রতিস্থাপন করে
ব্লগ পোস্ট একটি tar.gz
ফাইল সংযুক্ত করেছে , এতে প্রয়োজনীয় ফাইলগুলি রয়েছে।
header.template
এটিতে একটি ফাইল রয়েছে, যেখানে আপনি একটি কাস্টম মন্তব্য লিখতে পারেন, এটি একাধিক লাইন বিস্তৃত করতে পারে।
remove_header.awk
এটিতে একটি স্ক্রিপ্ট রয়েছে যা বিদ্যমান শিরোনামকে নতুন শিরোনামের সাথে প্রতিস্থাপন করে।
এটি চালানোর জন্য:
find . -name "*.h" -exec ~/rh/replace_header.sh {} \;