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. 그렇지 않으면보안이 취약해질 수 있습니다.

관련 정보