bash에서 basename {}과 문자열 작업 결합

bash에서 basename {}과 문자열 작업 결합

.cpp로 끝나는 모든 파일을 찾아 이름을 바꾸는 스크립트를 작성하고 싶습니다 .cc. 검색은 시작 경로 R(스크립트의 매개변수)부터 반복적으로 수행됩니다.

인수가 작성되지 않으면 R이 실제 디렉터리가 됩니다.

나는 이미 다음과 같이 썼습니다.

#!/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

하지만 표현하는 방법을 몰라서 선을 찾는데 어려움을 겪고 있다는 걸 알아요{}를 사용할 때 확장을 제거하고 새 확장을 추가하고 싶습니다.

답변1

직접 조작하여 이를 수행하지 마십시오 {}.

이미 inline 을 사용하고 있으므로 sh이를 매개변수로 전달하면 {}전혀 사용할 필요가 없습니다.basename

find "$R" -name "*.cpp" -type f -exec sh -c '
  for f do
    mv -- "$f" "${f%.*}.cc"
  done
' sh {} +

큰따옴표를 사용해야 합니다 $R. 그렇지 않으면보안 취약점으로 이어집니다.

관련 정보