![매개변수 확장을 위해 find -exec {}를 사용하는 방법은 무엇입니까? [복사]](https://linux55.com/image/140916/%EB%A7%A4%EA%B0%9C%EB%B3%80%EC%88%98%20%ED%99%95%EC%9E%A5%EC%9D%84%20%EC%9C%84%ED%95%B4%20find%20-exec%20%7B%7D%EB%A5%BC%20%EC%82%AC%EC%9A%A9%ED%95%98%EB%8A%94%20%EB%B0%A9%EB%B2%95%EC%9D%80%20%EB%AC%B4%EC%97%87%EC%9E%85%EB%8B%88%EA%B9%8C%3F%20%5B%EB%B3%B5%EC%82%AC%5D.png)
다음과 같은 것을 병합하고 싶습니다.
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
구현에서도 작동할지는 확실하지 않습니다.