Solaris 10에서 파일 이름 대신 find/ -exec sh -c "echo {}"가 "{}"를 인쇄하는 이유는 무엇입니까?

Solaris 10에서 파일 이름 대신 find/ -exec sh -c "echo {}"가 "{}"를 인쇄하는 이유는 무엇입니까?

나는 일반적으로 Solaris를 사용하지 않지만 오늘은 쉘을 사용하여 식별된 파일에 대한 작업을 수행하기 위해 find 명령을 작성해야 했습니다. 나는 이 {}문자들이 대체되지 않았으며 대체 문자를 찾을 수 없다는 것을 발견했습니다.

예를 들어:

 bash-3.2# find / -exec sh -c "echo {}" \;

{}이로 인해 파일 이름 대신 각 파일이 인쇄됩니다 .

답변1

이를 사용하는 유일한 표준 방법은 find -exec …별도의 매개변수로 전달하는 것입니다. {}매개변수가 포함될 때의 동작은 {}표준화되지 않습니다. 당신은 {}부분 문자열 내에서 대체하는 GNU 동작 에 익숙한 것 같습니다 . findSolaris의 명령은 {}인수에 {}.

GNU 동작은 특별히 유용하지 않으며 때로는 짜증스러울 수도 있습니다. 인수에 파일 이름을 대체하는 것은 취약하기 때문입니다. 한계를 알지 못하면 파일 이름이 시작하고 끝나는 위치를 알 수 있는 방법이 없습니다. 예를 들어 GNU find를 사용하면 find / -exec sh -c "echo {}" \;실제로아니요일반적으로 파일 이름을 인쇄합니다. 쉘 특수 문자가 포함되어 있지 않은 경우에만 파일 이름을 인쇄합니다. 라는 파일이 포함된 디렉터리에서 실행하는 경우 ;rm -r ~파일에 작별을 고하세요.

셸을 호출하는 안정적이고 이식 가능한 방법은 find -exec파일 이름을 셸에 인수로 전달하는 것입니다.

find … -exec sh -c 'echo "$0"' {} \;

대부분의 경우 매개변수를 일괄적으로 전달하고 셸에서 반복할 수 있습니다. 조금 빠르네요. 쉘 코드 뒤의 첫 번째 매개변수 $0"$@".

find … -exec sh -c 'for x; do echo "$x"; done' _ {} +

당신은 또한 볼 수 있습니다공백이나 기타 특수 문자 때문에 쉘 스크립트가 멈추는 이유는 무엇입니까?

답변2

매뉴얼 페이지와 표준에 명시된 대로 {}별도의 매개변수에 있어야 합니다.

find / -exec sh -c 'echo $1' dummy '{}' \;

예상대로 작동합니다.

dummy쉘은 sh -c cmd명령 매개변수가 가 된 후 첫 번째 매개변수를 할당 $0하고 다음 매개변수가 가 되므로 이 매개변수가 필요하다는 점에 유의하십시오 $1.

관련 정보