
명령 섹션에서 -exec
2개의 명령을 사용할 수 있습니까 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 모드로 사용하십시오.