find (GNU findutils) 4.8.0
한 시스템(광산)에 다음 명령을 실행하면 가 있습니다.
find . -name '*.cpp' -exec sh -c 'f=$0; echo mv "$f" "${f/cpp/CPP}"' {} \;
나는 다음과 같은 목록을 얻습니다.
mv ./stuff.cpp ./stuff.CPP
mv ./main.cpp ./main.CPP
...
일치하는 각 파일은 한 줄을 차지합니다.
(그런데, 확실히 존재하는 답변을 알려주실 수 있습니까? \;
로 변경하면 \+
파일이 처리되어 출력이 다음과 같이 처리되는 이유를 이해할 수 있습니까 mv ./stuff.cpp ./stuff.CPP
?)
내가 완전히 알지 못하는 다른 시스템에서 위 명령으로 인해 다음과 같은 오류가 발생하는 find
것을 확인했습니다.find (GNU findutils) 4.6.0.225-235f
./unittest/tTransform3.cpp: 1: ./unittest/tTransform3.cpp: Bad substitution
./unittest/tTransform2.cpp: 1: ./unittest/tTransform2.cpp: Bad substitution
...
후자의 시스템에 어떤 문제가 있는지 이해하도록 도와줄 수 있는 사람이 있나요?
답변1
sh
두 번째 시스템에서는 dash 또는 다른 POSIX 셸을 사용할 수 있습니다. ${var/pat/rep}
아니요POSIX 매개변수 확장이므로 POSIX에서는 sh
필요하지 않습니다. 시스템에 GNU find가 있으므로 bash도 있을 수 있으므로 bash를 사용하십시오 bash -c
(bashism을 사용할 때 항상 그렇듯이).