Ich versuche, mit einer for-Schleife einen Lizenzheader zu allen Header- und Quelldateien in einem Projektverzeichnis hinzuzufügen. Das funktioniert nicht. Gibt es einen anderen Ansatz sed
?
Ich versuche, mit einer for-Schleife einen Lizenzheader zu allen Header- und Quelldateien in einem Projektverzeichnis hinzuzufügen. Das funktioniert nicht. Gibt es einen anderen Ansatz sed
?
Antworten:
for f in **/*.cpp; do
cat header_file $f > $f.new
mv $f.new $f
done
globstar
Bash einschalten müssen, damit dies funktioniert.
Dies ist mehr oder weniger nur ein ausführlicher Kommentar zur Antwort von Daniel Serodio . Ich fing an, es als Kommentar zu schreiben, aber es wurde schnell zu groß ...
Damit ein Bash-Glob rekursiv ist, ist es erforderlich shopt -s globstar
. Sie müssen globstar aktivieren, sonst **
funktioniert es nicht. Die Globstar-Shell-Option wurde in Version 4 von Bash eingeführt.
my.cpp/
Verwenden Sie den Test, um zu vermeiden, dass ein Verzeichnis wie [[ -f $f ]]
... verarbeitet wird. Wenn der Test in doppelten eckigen Klammern steht, müssen Variablen nicht in doppelte Anführungszeichen gesetzt werden.
Sie können auch die Möglichkeit in Betracht ziehen, dass keine übereinstimmenden Dateien vorhanden sind, indem Sie verwenden shopt -s nullglob
, wodurch Muster, die nicht mit Dateien übereinstimmen, zu einer Nullzeichenfolge und nicht zu sich selbst erweitert werden.
Mehr Muster zu handhaben , können Sie die Kette die glob Muster: **/*.cpp **/*.h
, aber vielleicht vorzugsweise, wenn die Schale Option extglob ist auf über shopt -s extglob
können Sie solche Konstrukte verwenden wie **/*.@(cpp|h)
die mehrere Durchgänge über das Dateisystem vermeidet; einmal für jedes Muster.
Wenn Sie .files
einbezogen werden möchten , verwenden Sie .*.cpp
etc oder useshopt -s dotglob
Verwenden Sie sponge
from package , um das Ändern einer Datei, die weitergeleitet wird, sicher zu handhaben moreutils
(es erspart Ihnen das Erstellen Ihrer eigenen temporären Datei).
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
[[
kann aber problemlos mit einer Null umgehen $f
.
unset x; [ -f $x ] && echo exists
Berichte "existiert" ... (behoben)
**/*.@(cpp|h)
mit$( find . -name "*.h" -name "*.cpp")
Vielen Dank an @fred, @maxmackie, @enzotib.
Können Sie bitte das von mir befolgte Verfahren überprüfen?
#!/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
Andernfalls wird der Lizenzheader mehrmals kopiert.
Bitte schlagen Sie mir ein Muster vor, um alle Header und Quellen im Projektverzeichnis und in den Unterverzeichnissen zu durchsuchen.
Ich konnte nicht vollständig verstehen, was @fred vorgeschlagen hat.
targln=2; findln=$(sed -rne $targln'{\|// Copyright|=;q}' "$f"); if ((findln==targln));then
... aber natürlich vor allem gründlich testen ... PS. Unter Unix & Linux ist es selbstverständlich , solche Extras in Ihrer ursprünglichen Frage zu posten , nicht als Antwort ...
grep
, -q
Option hinzufügen grep
. Fügen Sie immer doppelte Anführungszeichen hinzu $f
.
Sie können dies mit ex
oder tun, ed
wenn Sie es vorziehen (Sie sollten dies nicht mit der sed
von Ihnen angeforderten sed
Option tun , die zum Bearbeiten von Streams vorgesehen ist, -i
was aus verschiedenen Gründen eine schlechte Idee ist):
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
eine schlechte Idee?
sed -i
Symlinks und Hardlinks, was zu unerwartetem Verhalten führt. Bestenfalls ist es nicht intuitiv, im schlimmsten Fall ist es aktiv schädlich.
#!/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 Gappmeiers Blog - Wie man rekursiv Dateiköpfe von Quelldateien ersetzt
Der Blog-Beitrag hat eine tar.gz
Datei angehängt , die die benötigten Dateien enthält.
Es hat eine header.template
Datei, in die Sie einen benutzerdefinierten Kommentar schreiben können. Sie kann mehrere Zeilen umfassen.
Es verfügt über ein remove_header.awk
Skript, das vorhandene Header durch den neuen Header ersetzt.
Um es auszuführen:
find . -name "*.h" -exec ~/rh/replace_header.sh {} \;