매개변수 확장을 위해 find -exec {}를 사용하는 방법은 무엇입니까? [복사]

매개변수 확장을 위해 find -exec {}를 사용하는 방법은 무엇입니까? [복사]

다음과 같은 것을 병합하고 싶습니다.

for f in */*; do mv "$f" "${f%/*}/foo.${f##*.}"; done  

find x -exec y {} \;스타일의 워크플로를 입력하세요.

루프 for구조 및 "$f"변수는 생략될 수 있습니다. 루프는 -exec표준 반복 동작으로 대체되고 변수(현재 반복의 파일 이름 포함)는 호환되지 않거나 문제가 있는 것 같습니다 {}.
특히 중괄호와 세미콜론 등이 서로 충돌하기 때문입니다.

답변1

당신은 그것을 사용할 수 있습니다 -exec bash -c 'your code here using $0'.

귀하의 경우에는 이

find */* -exec bash -c 'mv "$0" "${0%/*}/foo.${0##*.}"' {} \;

당신과 매우 유사합니다 for.

for f in */*; do        mv "$f" "${f%/*}/foo.${f##*.}"; done  

-exec sh -c '.....'팁 1: bash를 사용하지 않는 경우에도 작동합니다.

-exec팁 2: 동일한 조회에서 여러 항목을 결합할 수 있습니다.

find ./* -type f -exec echo {} \; -exec cat {} \;

팁 3: 간단한 구성의 경우 다음 구문이 유효합니다.

find . -type f  ! -name "*.txt" -exec mv -v '{}' '{}'.txt \;

팁 4: 명령을 실행하기 전에 사용자 확인이 필요한 방법을 -exec사용할 수 있습니다 (테스트에 유용함)-ok

위의 내용은 GNU find(버전 4.6.0)에서 작동하지만 이 모든 팁이 다른 find구현에서도 작동할지는 확실하지 않습니다.

관련 정보