나는 일반적으로 Solaris를 사용하지 않지만 오늘은 쉘을 사용하여 식별된 파일에 대한 작업을 수행하기 위해 find 명령을 작성해야 했습니다. 나는 이 {}
문자들이 대체되지 않았으며 대체 문자를 찾을 수 없다는 것을 발견했습니다.
예를 들어:
bash-3.2# find / -exec sh -c "echo {}" \;
{}
이로 인해 파일 이름 대신 각 파일이 인쇄됩니다 .
답변1
이를 사용하는 유일한 표준 방법은 find -exec …
별도의 매개변수로 전달하는 것입니다. {}
매개변수가 포함될 때의 동작은 {}
표준화되지 않습니다. 당신은 {}
부분 문자열 내에서 대체하는 GNU 동작 에 익숙한 것 같습니다 . find
Solaris의 명령은 {}
인수에 {}
.
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
.