Ich möchte ein Skript schreiben, das alle Dateien mit der Endung findet .cpp
und sie in umbenennt .cc
. Die Suche wird rekursiv von einer Startroute R aus durchgeführt, die das Argument des Skripts ist.
Wenn kein Argument geschrieben wird, ist R das tatsächliche Verzeichnis.
Und ich habe geschrieben:
#!/bin/bash
R=.
if [[ $# == 1 ]]
then
echo "$# == 1"
if [[ -d $1 ]]
echo "$1 is directory"
then
R=$1
else
printf "Error $1 should be a directory"
exit 1
fi
find $R -name "*.cpp" -exec sh -c 'mv {} $(dirname {})${$(basename {})%.cpp}".cc" ' \;
exit 0
else
printf "Invocation is: $0 directory"
exit 1
fi
Aber ich weiß, dass ich Probleme mit der Suchzeile habe, weil ich nicht weiß, wie ich es ausdrücken sollIch möchte die Erweiterung löschen und die neue anhängen, wenn ich {} verwende
Antwort1
Tun Sie dies nicht, indem Sie direkt auf zugreifen {}
.
Sie haben inline verwendet sh
, also übergeben Sie {}
es als Argument. Außerdem müssen Sie Folgendes basename
überhaupt nicht verwenden:
find "$R" -name "*.cpp" -type f -exec sh -c '
for f do
mv -- "$f" "${f%.*}.cc"
done
' sh {} +
Beachten Sie, dass Sie doppelte Anführungszeichen setzen müssen $R
, andernfallses kann zu Sicherheitslücken führen.