대형 디렉토리의 파일에서 x비트를 효율적으로 제거

대형 디렉토리의 파일에서 x비트를 효율적으로 제거

수백만 개의 파일과 디렉터리가 포함된 /some/dir 디렉터리가 있습니다. 모든 파일에 대해 X비트를 제거해야 하지만 디렉터리에서는 제거해야 합니다.

다음은 작동합니다:

find /some/dir -type f -chmod -x {} \;

그러나 나는 이것이 각 파일에 대해 "chmod" 프로세스를 생성한다고 믿습니다. 그것이 오랫동안 실행되는 이유를 설명할 수 있습니다.

이 작업을 보다 효율적으로 수행할 수 있는 방법이 있습니까?

답변1

게다가 xargsLjm Dullaart가 언급했듯이 다음을 사용할 수 있습니다.

find /some/dir -type f -exec chmod -x {} +

디버그 트릭으로 다음을 사용하여 생성된 명령을 볼 수 있습니다.

find /some/dir -type f -exec echo chmod -x {} +

매뉴얼 페이지에서찾기(1)명령:

-exec command {} +
이 작업 변형은 -exec선택한 파일에 대해 지정된 명령을 실행하지만 명령줄은 선택한 각 파일 이름을 끝에 추가하여 작성됩니다. 명령의 총 호출 수는 일치하는 파일 수보다 훨씬 적습니다. 명령줄은 xargs가 명령줄을 작성하는 것과 거의 동일한 방식으로 작성됩니다. 의 인스턴스는 {}명령 내에서 하나만 허용되며 끝 부분, +; 바로 앞에 나타나야 합니다. \쉘의 해석으로부터 보호하려면 이스케이프 처리하거나 ( 로) 인용해야 합니다 . 명령은 시작 디렉터리에서 실행됩니다. 양식 을 사용한 호출이 +종료 상태로 0이 아닌 값을 반환하는 경우 find는 0이 아닌 종료 상태를 반환합니다. find에 오류가 발생하면 즉시 종료될 수 있으므로 보류 중인 일부 명령이 전혀 실행되지 않을 수 있습니다. 이러한 이유로 -exec my-command ... {} + -quitmy-command가 실제로 실행되지 않을 수도 있습니다. 이 변형은 -exec항상 true를 반환합니다.

답변2

xargs생성을 제한하는 데 사용합니다 .

find /path/to/base/dir -type f -print0 | xargs -0 chmod -x

관련 정보