Kombinieren von Basisnamen {} und String-Operationen in Bash

Kombinieren von Basisnamen {} und String-Operationen in Bash

Ich möchte ein Skript schreiben, das alle Dateien mit der Endung findet .cppund 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.

verwandte Informationen