find 명령의 -exec에서 두 개의 bash 명령을 사용하는 방법은 무엇입니까?

find 명령의 -exec에서 두 개의 bash 명령을 사용하는 방법은 무엇입니까?

명령 섹션에서 -exec2개의 명령을 사용할 수 있습니까 find?

나는 비슷한 것을 시도했습니다 :

find . -name "*" -exec  chgrp -v new_group {}  ; chmod -v 770 {}  \;

나는 얻다:

find: -exec 인수 누락
chmod: 액세스할 수 없음 {}: 해당 파일 또는 디렉토리가 없음
chmod: 액세스할 수 없음;: 해당 파일 또는 디렉토리가 없음

답변1

명령 의 경우 계속해서 더 많은 명령을 추가 find할 수도 있습니다 -exec.

find . -name "*" -exec chgrp -v new_group '{}' \; -exec chmod -v 770 '{}' \;

이 명령의 결과는 다음을 사용하는 것과 동일합니다.

chgrp -v new_group 파일&&chmod -v 770 파일

모든 파일에.

find등 의 모든 매개변수 -name는 실제로-exec-size시험: find지금까지 전체 체인이 평가된 한 계속해서 하나씩 실행될 것입니다.진짜. 따라서 각 연속 -exec명령이 실행됩니다.~하지 않는 한이전 반품진짜(즉, 0명령의 종료 상태) 그러나 find논리 연산자도 이해합니다.또는( -o) 그리고아니요( !). 따라서 일련의 -exec테스트를 사용하여에도 불구하고이전 결과의 경우 다음과 같은 것을 사용해야 합니다.

find . -name "*" \( -exec chgrp -v new_group {} \; -o -true \) -exec chmod -v 770 {} \; 

답변2

find . -name "*" -exec sh -c 'chgrp -v new_group "$0" ; chmod -v 770 "$0"' {} \;

답변3

명령은 먼저 셸에서 로 구분된 두 개의 명령으로 구문 분석됩니다 ;. 이는 개행 문자에 해당합니다.

find . -name "*" -exec chgrp -v new_group {}
chmod -v 770 {} \;

쉘 명령을 실행하려면 쉘을 명시적으로 호출하십시오 bash -c(또는 sh -c상관하지 않는 경우 특별히 bash를 실행하십시오).

find . -name "*" -exec sh -c 'chgrp -v new_group "$0"; chmod -v 770 "$0"' {} \;

{}셸로 사용될 인수는 0번째 인수(일반적으로 셸이나 스크립트의 이름이지만 여기서는 중요하지 않음)이므로 로 인용 됩니다 "$0".

한 번에 여러 파일 이름을 셸에 전달하고 셸에서 해당 파일을 반복하도록 할 수 있어 속도가 더 빠릅니다. 여기서는 _이를 스크립트 이름으로 전달하고 다음 매개변수는 파일 이름이며 for x(의 단축키 for x in "$@")가 반복됩니다.

find . -name "*" -exec sh -c 'for x; do chgrp -v new_group "$x"; chmod -v 770 "$x"; done' _ {} +

bash 4 또는 zsh부터는 여기를 전혀 볼 필요가 없습니다. Bash에서 재귀 디렉터리 glob의 상태를 활성화하려면 실행 shopt -s globstar( 에 입력 )하세요. (zsh에서는 항상 활성화되어 있습니다.) 그러면~/.bashrc**/

chgrp -v new_group -- **/*; chmod -v 770 -- **/*

또는 파일을 순차적으로 반복하려는 경우

for x in **/*; do
  chgrp -v new_group -- "$x"
  chmod -v 770 -- "$x"
done

이 명령과의 한 가지 차이점 find은 쉘이 도트 파일(이름이 로 시작하는 파일 .)을 무시한다는 것입니다. 이를 포함하려면 bash에서 먼저 설정하고 GLOBIGNORE=.:..zsh에서 **/*(D)glob 모드로 사용하십시오.

관련 정보