-exec 드라 이런을 찾으시겠습니까?

Dec 27 2020

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단지 예제 명령이며 일반적인 경우에 관심이 있습니다.

답변

18 rAlen Dec 27 2020 at 07:10

echo rm대신 실행할 수 있습니다.rm

find . type f -exec echo rm {} \;

또한, find-delete찾은 파일을 삭제하는 옵션을

3 l0b0 Dec 27 2020 at 07:28

를 들어 rm구체적으로, 당신은 필요가 없습니다 -exec: 단순히 실행 find . -type f목록 및 추가 -delete(분명히 일치하는 파일이 그 사이에 삭제 / 생성되는 금지) 이전 명령에 의해 나열된 파일을 삭제합니다.

또한 rm임의의 수의 인수를 \;사용 +하는 명령의 경우 가능한 한 적은 명령을 실행 하기 위해 대체 할 수 있습니다.

2 CharlesDuffy Dec 28 2020 at 00:38

약간의 입맛이 있지만를 사용 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.