.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
. 그렇지 않으면보안 취약점으로 이어집니다.