수백만 개의 파일과 디렉터리가 포함된 /some/dir 디렉터리가 있습니다. 모든 파일에 대해 X비트를 제거해야 하지만 디렉터리에서는 제거해야 합니다.
다음은 작동합니다:
find /some/dir -type f -chmod -x {} \;
그러나 나는 이것이 각 파일에 대해 "chmod" 프로세스를 생성한다고 믿습니다. 그것이 오랫동안 실행되는 이유를 설명할 수 있습니다.
이 작업을 보다 효율적으로 수행할 수 있는 방법이 있습니까?
답변1
게다가 xargs
Ljm 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 ... {} + -quit
my-command가 실제로 실행되지 않을 수도 있습니다. 이 변형은-exec
항상 true를 반환합니다.
답변2
xargs
생성을 제한하는 데 사용합니다 .
find /path/to/base/dir -type f -print0 | xargs -0 chmod -x