리눅스 쉘: find -exec에서 -exec 찾기

리눅스 쉘: find -exec에서 -exec 찾기

얻은 모든 파일과 디렉터리에 대해 다음 명령을 실행 하고 싶습니다 chmod 555(test 디렉터리와 그 안의 모든 파일과 디렉터리를 반환합니다).

find ~/.config/google-chrome -type d -name test -exec find {} \;

답변1

이 경우 chmod -R다음을 수행 할 수 있습니다.user26112의 답변, 그러나 일반적으로 다음과 같이 할 수 있습니다.

find ~/.config/google-chrome -type d -name test -exec sh -c '
  for i do
    find "$i" -exec chmod 555 {\} +
  done' sh {} +

비결은 쉘을 사용하고 따옴표(예: {\}또는 {"}")를 사용하여 내부가 {}외부로 확장되지 않도록 하는 것입니다 find(단지 인수의 일부일지라도 find해당 구현은 여전히 ​​확장된다는 점을 고려).{}

GNU find4.9.0 이상에서는 stdin에서 NUL 구분 레코드로 처리할 파일 목록 가져오기도 지원하므로 다음을 수행할 수 있습니다.

find -files0-from <(
    find ~/.config/google-chrome -type d -name test -print0
  ) -exec chmod 555 {} +

이전 버전의 경우 GNU를 사용하여 유사한 작업을 수행 xargs하고 sh매개변수 순서를 변경할 수 있습니다.

xargs -r0a <(
    find ~/.config/google-chrome -type d -name test -print0
  ) sh -c 'exec find "$@" -exec chmod 555 {} +' sh

( <(...)프로세스 교체, zsh 및 bash도 ksh 기능을 지원하므로 yash's'와 혼동 하지 마세요.프로세스 리디렉션).

답변2

chmod플래그 를 사용하여 -R디렉터리와 그 아래 계층 구조에 있는 모든 파일 및 디렉터리의 권한을 변경할 수 있습니다.

find ~/.config/google-chrome -type d -name test -exec chmod -R 555 '{}' \;

답변3

정말로 둘 다 원한다면 find -exec다음을 시도해 보십시오.

find /etc -type f -exec sh -c 'find "$0" -exec echo {\} \;' {} \;

(이것은 찾은 내용을 echo명령 에 전달합니다 )find

find /etc -type d -exec sh -c 'find "$0" -type f -exec echo "$0" {\} \;' {} \;

(유용한 예: 디렉터리 이름과 그 안에 있는 파일 목록 인쇄)

다음 을 사용 하여 절의 파이프 문제를 sh -c해결할 수도 있습니다.find -execsh -c$0$1

답변4

이 명령을 실행할 수도 있습니다. 모든 디렉터리에서 실행되지만 인수로 전달된 여러 "테스트" 디렉터리를 실행한다는 +인수를 사용합니다 .findchmod

$ find ~/.config/google-chrome -type d -name test -exec chmod -R 555 '{}' +

관련 정보