이 명령을 사용하여 파일의 권한을 재귀적으로 설정하고 있습니다.
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_COMMAND
chmod
chmod
답변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 파일이 변경되었는지 확인할 수 있습니다.