-exec 드라 이런을 찾으시겠습니까?
find . -exec somecommand {} \;
실제로 명령을 실행하지 않고 대체로 결과가 무엇인지 확인하는 방법이 있습니까? 시험 실행 (또는 테스트 실행 또는 인쇄)처럼?
예를 들어 다음과 같은 파일 구조가 있다고 가정합니다.
/a/1.txt
/a/2.txt
/a/b/3.txt
출력이 stdout에 인쇄되지만 다음과 같이 실행되지 않도록 디렉토리 find . type f -exec rm {} \;
내에서 테스트하는 방법이 있습니까?a
rm 1.txt
rm 2.txt
rm b/3.txt
업데이트 참고 : rm
단지 예제 명령이며 일반적인 경우에 관심이 있습니다.
답변
echo rm
대신 실행할 수 있습니다.rm
find . type f -exec echo rm {} \;
또한, find
이 -delete
찾은 파일을 삭제하는 옵션을
를 들어 rm
구체적으로, 당신은 필요가 없습니다 -exec
: 단순히 실행 find . -type f
목록 및 추가 -delete
(분명히 일치하는 파일이 그 사이에 삭제 / 생성되는 금지) 이전 명령에 의해 나열된 파일을 삭제합니다.
또한 rm
임의의 수의 인수를 \;
사용 +
하는 명령의 경우 가능한 한 적은 명령을 실행 하기 위해 대체 할 수 있습니다.
약간의 입맛이 있지만를 사용 echo
하는 접근 방식과 달리 아래는 파일 이름에 따옴표, 공백, 셸 메타 문자 등이 포함 된 경우에도 올바른 결과를 얻기 위해 변경하지 않고 셸에서 실행할 수있는 코드를 출력합니다.
printcmd() { printf '%q ' "$@"; printf '\n'; } find . -exec bash -c "$(declare -f printcmd); "'printcmd "$@"' _ \
somecommand {} \;
우리가 -exec
인수 앞에 추가하는 문자열 은 정확히 bash -c "$(declare -f printcmd); "'printcmd "$@"' _
- $(declare -f printcmd)
함수에 대한 코드로 확장됩니다. 그 후, 우리는 실제로 호출 인수 기능 $1
이후와를 넣어 _
위한 자리로 $0
.
해당 셸에 대한 출력을 이스케이프하려면 bash 대신 zsh
또는 대체 할 수 있습니다 ksh
.