찾다. .[^.]* -type f -print0 | xargs -0 sudo chmod 664가 작동하지 않습니다.

찾다. .[^.]* -type f -print0 | xargs -0 sudo chmod 664가 작동하지 않습니다.

이 명령을 사용하여 파일의 권한을 재귀적으로 설정하고 있습니다.

clime@vm6879 /srv/www-php/steeltrading $ find . .[^.]* -type f -print0 | xargs -0 sudo chmod 664

그러나 이 명령을 실행한 후에도 일부 파일의 권한(대부분)은 여전히 ​​변경되지 않습니다.

clime@vm6879 /srv/www-php/steeltrading $ ll media/xmlconnect/system/ok.gif 
-rwxrwxr-x. 1 www www 295 Jul  5  2012 media/xmlconnect/system/ok.gif

파일이 목록에 있는지 확인하기 위해 실행하면 find볼 수 있습니다.

clime@vm6879 /srv/www-php/steeltrading $ find . .[^.]* -type f | grep ok.gif
./media/xmlconnect/custom/ok.gif
./media/xmlconnect/original/ok.gif
./media/xmlconnect/system/ok.gif

미디어 디렉터리로 이동하여 명령을 다시 실행하면 파일이 마침내 올바른 권한을 얻게 됩니다.

clime@vm6879 /srv/www-php/steeltrading $ cd media/
clime@vm6879 /srv/www-php/steeltrading/media $ find . .[^.]* -type f -print0 | xargs -0 sudo chmod 664
clime@vm6879 /srv/www-php/steeltrading/media $ ll xmlconnect/system/ok.gif 
-rw-rw-r--. 1 www www 295 Jul  5  2012 xmlconnect/system/ok.gif

일부 파일이 실행되지 않는 것 같아서 문제인 sudo chmod 664것 같지만 xargs이상합니다(오류 메시지 없음). 가능한 이유가 무엇인지 아시나요?

편집: 아니면 대량의 데이터를 파이핑하는 것이 문제가 될 수 있나요?

답변1

find도트 파일은 건너뛰지 않으므로 중복되고 .[^.]*( .[!.]*표준 구문에서) 이러한 파일이 두 번 처리됩니다(디렉터리는 두 번 내려갑니다). (예를 들어 .[!.]*호출된 파일이 누락될 수도 있습니다 ..foo.)

그러나 find기본적으로 디렉터리에 대한 기호 링크는 삭제되지 않습니다. 따라서 media외부 영역에 대한 심볼릭 링크인 경우 .해당 영역의 파일은 처리되지 않습니다.

-L를 사용하여 find에게 심볼릭 링크를 따르도록 지시 할 수 있습니다 . 그러나 chmod일반 파일에 대한 심볼릭 링크인 파일 도 호출된다는 점에 유의하세요 .

sudo find -L . -type f -exec chmod 664 {} +

또는 일부 find/ xargs구현을 사용하십시오.

find -L . -type f -print0 | sudo xargs -r0 chmod 664

여기에서 말하는 것과는 반대로, 매개변수 목록 xargs이 너무 크면 분할하는 책임을 지게 됩니다 find -exec +.chmod

하지만 여기서 말하는 한계는 execve(2)명령(시스템 호출)과 환경에 전달되는 매개변수의 누적 크기라는 점에 유의해야 합니다.

find한계에 도달하지 않았는지 확인하고 xargs약간의 여백을 남겨 두지만 다음과 같이 실행하면:

find . -type f -print0 | xargs -r0 sudo chmod 644

바꾸다:

find . -type f -print0 | sudo xargs -r0 chmod 644

sudo( 에 의해 호출되는) 명령 은 xargs전달될 모든 인수를 수신 하고 파일 목록이 포함된 환경 변수 chmod도 다시 전달되므로 전달된 arg+env 크기의 약 두 배가 되며 왜 한도는 초과입니다.SUDO_COMMANDchmodchmod

답변2

전달한 인수 문자열이 chmod너무 길 수 있습니다. 여기에는 몇 가지 옵션이 있습니다.

find의 exec 옵션을 사용하세요.

세미콜론과 함께 사용하면 find의 exec 옵션은 발견된 각 파일에 대해 명령을 한 번 실행합니다 find . .[^.]* -type f -exec sudo chmod 664 -- '{}' \;.

xargs를 사용하여 인수 수를 제한하십시오.

xargs -n5명령 인스턴스당 최대 5개의 매개변수를 전달할 수 있습니다. 이 -s플래그를 사용하여 명령에 전달되는 문자 수를 제한 할 수도 있습니다 xargs -s4096. 더 나은 성능을 위해 제한을 늘릴 수 있습니다. 너무 높이지 않도록 주의하세요.

재귀 chmod

chmod재귀 옵션이 있습니다. 그러나 이는 디렉터리와 파일에 영향을 미칩니다. 디렉터리에서 실행 비트 설정을 해제하는 것이 걱정된다면 첫 번째 명령을 실행한 후 실행 chmod -R +X(대문자 사용 참고 )하여 X디렉터리에서 실행 비트를 반복적으로 설정할 수 있습니다.

답변3

디렉토리 이름으로 무엇을 하려는지 이해가 되지 않습니다.[^.]* (중복인 것 같습니다) 그리고 -print0 -0 옵션이 필요하지 않다고 생각합니다. 어딘가에 버퍼 오버플로가 있는 것 같습니다. 파이프 또는 명령 행 크기

노력하다

find . -f file  -xargs chmod {}\;

chmod에서 -v를 사용하여 ech 파일이 변경되었는지 확인할 수 있습니다.

관련 정보