find 명령의 -exec에서 두 개의 bash 명령을 어떻게 사용합니까? find있습니까? 나는 다음과

명령 -exec부분에 2 개의 명령을 사용할 수 find있습니까?

나는 다음과 같은 것을 시도했다.

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

그리고 나는 얻는다 :

찾기 : -exec에 대한 인수 누락
chmod : {}에 액세스 할 수 없습니다 : 해당 파일 또는 디렉토리
가 없습니다. chmod : 액세스 할 수 없습니다. :: 해당 파일 또는 디렉토리가 없습니다.



답변

에 관해서는 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명령은 이전 명령이 true를 반환 한 경우에만 실행 됩니다 (즉 , 명령의 종료 상태). 그러나 또한 논리 사업자 등 이해 또는 ( ) 및 하지를 ( ). 따라서 이전 결과에 관계없이 일련의 테스트 를 사용하려면 다음과 같은 것을 사용해야합니다.0find-o!-exec

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

답변

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

답변

명령은 먼저 쉘에 의해 ;개행과 동등한 두 개의 명령으로 구문 분석됩니다 .

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

쉘 명령을 실행하려면 다음을 사용하여 쉘을 명시 적으로 호출하십시오 bash -c(또는 sh -c쉘이 특별히 배쉬인지 신경 쓰지 않는 경우).

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 패턴으로 사용하십시오.