Saya mencoba menambahkan header lisensi ke semua file header dan sumber file dalam direktori proyek menggunakan for for. Ini tidak berfungsi, apakah ada pendekatan lain yang digunakan sed
?
Saya mencoba menambahkan header lisensi ke semua file header dan sumber file dalam direktori proyek menggunakan for for. Ini tidak berfungsi, apakah ada pendekatan lain yang digunakan sed
?
Jawaban:
for f in **/*.cpp; do
cat header_file $f > $f.new
mv $f.new $f
done
globstar
bash agar ini berfungsi.
Ini kurang lebih hanya komentar panjang tentang jawaban Daniel Serodio . Saya mulai menulisnya sebagai komentar, tetapi dengan cepat menjadi terlalu besar ...
Agar bash glob menjadi rekursif, itu membutuhkan shopt -s globstar
. Anda harus mengaktifkan globstar, jika **
tidak, tidak akan berfungsi. Opsi shell globstar diperkenalkan ke versi 4 dari bash.
Untuk menghindari pemrosesan direktori seperti my.cpp/
, gunakan tes [[ -f $f ]]
... Ketika tes berada dalam tanda kurung ganda, variabel tidak perlu dikutip ganda.
Anda juga dapat mempertimbangkan kemungkinan tidak ada file yang cocok dengan menggunakan shopt -s nullglob
, yang memungkinkan pola yang tidak cocok dengan file untuk memperluas ke string nol, daripada diri mereka sendiri.
Untuk menangani beberapa pola, Anda dapat rantai pola gumpal: **/*.cpp **/*.h
, tapi mungkin Preferably, ketika shell pilihan extglob adalah pada melalui shopt -s extglob
, Anda dapat menggunakan konstruksi seperti seperti **/*.@(cpp|h)
yang menghindari melewati beberapa atas sistem file; satu kali untuk setiap pola.
Jika Anda ingin .files
dimasukkan, gunakan .*.cpp
dll, atau gunakanshopt -s dotglob
Untuk menangani pengubahan file dengan aman yang sedang disalurkan, gunakan sponge
dari paket moreutils
(menghemat Anda untuk membuat file temp Anda sendiri)
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
[[
dapat menangani null dengan anggun $f
.
unset x; [ -f $x ] && echo exists
laporan "ada" ... (tetap)
**/*.@(cpp|h)
dengan$( find . -name "*.h" -name "*.cpp")
@Fred terima kasih, @maxmackie, @enzotib.
Tolong periksa prosedur yang saya ikuti.
#!/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
jika tidak, tajuk lisensi akan disalin ke beberapa kali.
Tolong sarankan saya pola untuk pergi melalui semua header dan sumber di direktori proyek dan subdirektori.
Saya tidak bisa mengerti sepenuhnya apa yang telah disarankan @fred.
targln=2; findln=$(sed -rne $targln'{\|// Copyright|=;q}' "$f"); if ((findln==targln));then
... tapi, tentu saja, di atas dan di luar semua yang lain, ujilah secara menyeluruh terlebih dahulu ... PS. Merupakan hal yang wajar untuk kursus di Unix & Linux untuk mengirim tambahan seperti itu dalam pertanyaan awal Anda, bukan sebagai jawaban ...
grep
, tambahkan -q
opsi ke grep
. Selalu tambahkan tanda kutip ganda di sekitar $f
.
Anda dapat melakukan ini dengan ex
atau ed
jika Anda lebih suka (Anda tidak boleh melakukan ini dengan sed
seperti yang Anda minta, sed
dirancang untuk mengedit stream, -i
adalah ide yang buruk karena berbagai alasan):
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
ide yang buruk?
sed -i
memecah symlink dan hardlink, menghasilkan perilaku yang tidak terduga. Paling-paling itu tidak intuitif, paling buruk itu berbahaya secara aktif.
#!/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
Blog Gerhard Gappmeier - Howto secara rekursif mengganti header file dari file sumber
Posting blog telah melampirkan tar.gz
file, berisi file yang dibutuhkan.
Ini memiliki header.template
file, di mana Anda dapat menulis komentar khusus, dapat menjangkau beberapa baris.
Ini memiliki remove_header.awk
skrip yang menggantikan tajuk yang ada dengan tajuk baru.
Untuk menjalankannya:
find . -name "*.h" -exec ~/rh/replace_header.sh {} \;