ฉันกำลังพยายามเพิ่มส่วนหัวของใบอนุญาตให้กับไฟล์ส่วนหัวและไฟล์ต้นฉบับในไดเรกทอรีโครงการโดยใช้ for loop วิธีนี้ใช้ไม่ได้มีวิธีอื่นอีกsed
ไหมที่ใช้?
ฉันกำลังพยายามเพิ่มส่วนหัวของใบอนุญาตให้กับไฟล์ส่วนหัวและไฟล์ต้นฉบับในไดเรกทอรีโครงการโดยใช้ for loop วิธีนี้ใช้ไม่ได้มีวิธีอื่นอีกsed
ไหมที่ใช้?
คำตอบ:
for f in **/*.cpp; do
cat header_file $f > $f.new
mv $f.new $f
done
globstar
ในทุบตีเพื่อให้การทำงาน
นี่เป็นเพียงคำอธิบายเพิ่มเติมเกี่ยวกับคำตอบของDaniel Serodio'` ฉันเริ่มเขียนมันเป็นความคิดเห็น แต่มันใหญ่ขึ้นอย่างรวดเร็ว ...
สำหรับ glob shopt -s globstar
ทุบตีที่จะเวียนเกิดก็ต้องใช้ คุณต้องเปิดใช้งาน globstar มิฉะนั้น**
จะไม่ทำงาน ตัวเลือก globstar shell ได้รับการแนะนำให้รู้จักกับ bash รุ่น 4
เพื่อหลีกเลี่ยงการประมวลผลไดเรกทอรีเช่นmy.cpp/
ใช้การทดสอบ[[ -f $f ]]
... เมื่อการทดสอบอยู่ในเครื่องหมายวงเล็บเหลี่ยมคู่ตัวแปรไม่จำเป็นต้องถูกยกมาสองครั้ง
นอกจากนี้คุณยังสามารถพิจารณาถึงความเป็นไปได้ที่จะไม่มีไฟล์ที่ตรงกันโดยใช้shopt -s nullglob
ซึ่งอนุญาตให้รูปแบบที่จับคู่ไฟล์ไม่ให้ขยายเป็นสตริง null แทนที่จะเป็นไฟล์เอง
ในการจัดการรูปแบบหลายรายการคุณสามารถโซ่รูปแบบ glob นี้**/*.cpp **/*.h
แต่บางที preferrably เมื่อตัวเลือกเปลือกextglobเป็นในทางshopt -s extglob
ที่คุณสามารถใช้โครงสร้างดังกล่าวเป็น**/*.@(cpp|h)
ที่หลีกเลี่ยงผ่านหลายช่วงระบบแฟ้ม; หนึ่งครั้งสำหรับแต่ละรูปแบบ
หากคุณต้องการ.files
ที่จะรวมใช้.*.cpp
ฯลฯ หรือใช้shopt -s dotglob
หากต้องการจัดการแก้ไขไฟล์ที่ถูกไพพ์อย่างปลอดภัยให้ใช้sponge
จากแพ็คเกจmoreutils
(ช่วยให้คุณไม่จำเป็นต้องสร้างไฟล์ temp ของคุณเอง)
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")
ขอบคุณ @fred, @maxmackie, @enzotib
คุณช่วยกรุณาตรวจสอบขั้นตอนที่ฉันได้ปฏิบัติตาม
#!/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
มิฉะนั้นส่วนหัวของใบอนุญาตจะถูกคัดลอกไปหลายครั้ง
โปรดแนะนำฉันรูปแบบที่จะผ่านส่วนหัวและแหล่งที่มาทั้งหมดในไดเรกทอรีโครงการและไดเรกทอรีย่อย
ฉันไม่เข้าใจสิ่งที่ @fred แนะนำอย่างสมบูรณ์
targln=2; findln=$(sed -rne $targln'{\|// Copyright|=;q}' "$f"); if ((findln==targln));then
... แต่แน่นอนเหนือกว่าสิ่งอื่นใดให้ทดสอบก่อน ... PS มันเป็นเรื่องปกติสำหรับหลักสูตรที่นี่ที่Unix & Linuxเพื่อโพสต์ความพิเศษเช่นนี้ในคำถามดั้งเดิมของคุณไม่ใช่คำตอบ ...
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
แบ่งการเชื่อมโยงและลิงก์ซึ่งทำให้เกิดพฤติกรรมที่ไม่คาดคิด ที่ดีที่สุดคือไม่ใช้งานง่ายและที่เลวร้ายยิ่งมันเป็นอันตราย
หากคุณมี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 \{}' \;
#!/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
บล็อกของ Gerhard Gappmeier - วิธีแทนที่ส่วนหัวไฟล์ซ้ำของไฟล์ต้นฉบับ
โพสต์บล็อกได้แนบtar.gz
ไฟล์ซึ่งมีไฟล์ที่จำเป็น
มันมีheader.template
ไฟล์ที่คุณสามารถเขียนความคิดเห็นที่กำหนดเองมันสามารถขยายหลายบรรทัด
มันมีremove_header.awk
สคริปต์ที่แทนที่ส่วนหัวที่มีอยู่ด้วยส่วนหัวใหม่
เพื่อเรียกใช้:
find . -name "*.h" -exec ~/rh/replace_header.sh {} \;