ডিরেক্টরিতে সমস্ত .h এবং .cpp ফাইলের জন্য কীভাবে পুনরায় লাইসেন্স শিরোনাম প্রিন্ড করা যায়


19

আমি লুপের জন্য একটি ব্যবহার করে একটি প্রকল্প ডিরেক্টরিতে সমস্ত হেডার ফাইল এবং উত্স ফাইলগুলিতে একটি লাইসেন্স শিরোনাম যুক্ত করার চেষ্টা করছি। এটি কাজ করছে না, অন্য কোনও পদ্ধতি ব্যবহার করছে sed?


1
খুব অনুরূপ কেস: unix.stackexchange.com/questions/20577/…
পিবিএম

উত্তর:


14
for f in **/*.cpp; do
  cat header_file $f > $f.new
  mv $f.new $f
done

1
এটি উল্লেখ করা উচিত যে এটি globstarকাজ করার জন্য আপনাকে ব্যাশ চালু করতে হবে ।
ক্রিস ডাউন

এবং আপনার দরকার বশ> ৪.০ (উদাহরণস্বরূপ, ম্যাক ওএস এক্স এবং রেডহ্যাট ৫ এখনও ৩. এক্স এ রয়েছে)
মাত্তিও

11

এটি কমবেশি ড্যানিয়েল সেরোদিও'র উত্তরের একটি বর্ধিত ভাষ্য । আমি এটিকে একটি মন্তব্য হিসাবে রাইটটিং করা শুরু করেছি, তবে এটি খুব দ্রুত বেড়েছে ...

বাশ গ্লোব পুনরাবৃত্ত হওয়ার জন্য এটি প্রয়োজন 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


+1, তবে [[চূড়ান্তভাবে একটি নাল পরিচালনা করতে পারে $f
এনজোটিব

@enzotib। ধন্যবাদ। আমি নিশ্চিত নই যে আমার কাছ থেকে এই ধারণাটি পেয়েছিলাম। এটি অবশ্যই একক বর্গাকার বন্ধনী কীভাবে কাজ করে (তা নয়) থেকে হয়েছিল ... উদাহরণস্বরূপ unset x; [ -f $x ] && echo exists রিপোর্টগুলি "বিদ্যমান" ... (স্থির)
পিটার.ও

যেহেতু ব্যাশ সংস্করণ 4 মূলধারার নয় এখনো আমি প্রতিস্থাপন করবে **/*.@(cpp|h)সঙ্গে$( find . -name "*.h" -name "*.cpp")
Matteo

3

আপনাকে @ ফ্রেড, @ ম্যাক্সম্যাকি, @ এঞ্জোটিব ধন্যবাদ।

আপনি কি দয়া করে আমি অনুসরণ করা পদ্ধতিটি চেক করতে পারেন?

#!/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 এখানে ইউনিক্স এবং লিনাক্সের কোর্সের পক্ষে আপনার মূল প্রশ্নে এই জাতীয় অতিরিক্ত পোস্ট করা উত্তর হিসাবে নয় ...
পিটার.ও

1
কিছু পরামর্শ: আশেপাশে প্রথম বন্ধনী সরান grep, এতে -qবিকল্প যুক্ত করুন grep। সর্বদা চারপাশে ডাবল উদ্ধৃতি যুক্ত করুন $f
enzotib

1
উদ্ধৃতিগুলি গুরুত্বপূর্ণ, অন্যথায় আপনাকে শব্দ বিভাজন দ্বারা সম্ভবত দংশিত করা হবে। একটি মৌলিক নিয়ম হিসাবে, প্রতিটি বিস্তৃতি উদ্ধৃত করুন যদি না আপনি জানেন যে শব্দের দ্বারা শব্দ বিভাজন বা অন্য ব্যাখ্যা সম্পাদিত হবে না।
ক্রিস ডাউন

3

আপনি এটি করতে পারেন 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প্রতীক এবং হার্ডলিঙ্কগুলি ভেঙে দেয়, যার ফলে অপ্রত্যাশিত আচরণ হয়। সর্বোপরি এটি স্বজ্ঞাত নয়, আরও খারাপভাবে এটি সক্রিয়ভাবে ক্ষতিকারক।
ক্রিস ডাউন

2

আপনার যদি header_fileকাঙ্ক্ষিত সামগ্রী রয়েছে:

find -name '*.cpp' -exec bash -c 'cat header_file \{} > \{}.new; mv \{}.new  \{}' \;
find -name '*.h' -exec bash -c 'cat header_file \{} > \{}.new; mv \{}.new  \{}' \;

1
#!/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

0

জেরহার্ড গ্যাপমিয়ারের ব্লগ - হাওটো পুনরাবৃত্তভাবে উত্স ফাইলগুলির ফাইল শিরোনামগুলি প্রতিস্থাপন করে

ব্লগ পোস্ট একটি tar.gzফাইল সংযুক্ত করেছে , এতে প্রয়োজনীয় ফাইলগুলি রয়েছে।

header.templateএটিতে একটি ফাইল রয়েছে, যেখানে আপনি একটি কাস্টম মন্তব্য লিখতে পারেন, এটি একাধিক লাইন বিস্তৃত করতে পারে।

remove_header.awkএটিতে একটি স্ক্রিপ্ট রয়েছে যা বিদ্যমান শিরোনামকে নতুন শিরোনামের সাথে প্রতিস্থাপন করে।

এটি চালানোর জন্য:

find . -name "*.h" -exec ~/rh/replace_header.sh {} \;
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.