
디렉토리를 반복하고 일부 이름을 일치시키고 삭제하는 쉘 스크립트에 몇 줄이 있습니다. 파일 시스템의 특정 영역은 쓰기 금지되어 있습니다.이를 유지하고 싶지만 프롬프트나 오류에 대한 다른 표시를 로그로 리디렉션하고 싶습니다.그들이 만날 때.
스크립트의 이 시점에서 사용하면 rm -r /path/to/directory
스크립트가 출력됩니다.
rm: descend into write-protected directory /path/to/directory/subdirectory?
따라서 자체 장치에 그대로 두면 작동이 중단되고 [결국] 시간 초과됩니다.
프롬프트에 "n"을 연결하여 이 동작을 수정해 보았습니다.
yes n | rm -rv /path/to/directory
이로 인해 두 가지 바람직하지 않은 결과가 발생합니다.
yes: standard output: Broken pipe; yes: write error
각 디렉토리 출력예삭제되었으며,rm: descend into write-protected...
메시지를 표준 출력으로 반환 하지 마십시오 .
이를 수행하는 올바른 방법은 무엇입니까?
고쳐 쓰다:yes n
@roaima에 따르면 파이프가 있으면 대화형이 아니기 때문에 실제로 프롬프트를 전혀 파이핑하지 않습니다 rm
. 실제로는 일부 출력을 얻기 위해 대화형 기능을 활용하고 있지만 대화형 기능을 끄면 프로그램이 오류와 함께 종료되기 때문에 이것은 아이러니합니다. 보호된 파일의 이름을 원하기 때문에 오류를 무시하고 싶지 않습니다(예: || true
SE의 다른 곳에서 많이 본 것처럼 추가).
답변1
rm
stdin이 터미널인 경우 쓰기 불가능한 대상에 대한 확인이 요청됩니다. -i
반면에 확인을 위해 플래그가 켜집니다.모두표적. 분명히 이러한 방법 중 어느 것도 에 yes n
파이프를 연결하는 간단한 솔루션 에 적합하지 않으므로 rm
다른 방법을 사용해야 합니다.
GNU find를 사용하여 하나 이상의 쓰기 모드 비트가 설정된 모든 객체를 제거합니다(일반적으로 테스트를 먼저 수행 -print
하기보다는 먼저 사용 -delete
).
find dir/ -perm /0222 -delete
또는 쓰기 모드 비트가 하나 이상 설정 (*)된 모든 파일을 삭제하고 쓰기 불가능한 디렉터리의 내용은 건너뜁니다.
find . -type d ! -perm /0222 -prune -o ! -type d -perm /0222 -exec rm {} +
(*실제로 디렉토리를 제외한 모든 것)
-delete
깊이 우선 검색(적어도 GNU find에서는)을 의미하며 작동하지 않으므로 -prune
여기서는 사용할 수 없습니다. 그런 다음 쓰기 가능한 빈 디렉터리를 삭제할 수 있습니다.
find . -type d -perm /0222 -delete
비어 있지 않은 디렉토리에 대해서는 오류가 발생합니다.
-perm /0222
"모든 쓰기 비트가 설정됨"을 의미하며 반의어는 ! -perm /0222
"쓰기 비트가 설정되지 않음"입니다.
다른 버전의 find에서는 +0222
대신 을 사용 /0222
하십시오. (GNU 매뉴얼 페이지에 따르면 전자는 POSIX 요구 사항과 충돌하므로 더 이상 사용되지 않습니다.)
쓰기 불가능한 파일과 디렉토리를 찾으려면 비슷하게 사용할 수 있습니다.
find . ! -perm /0222
쓰기 불가능한 디렉토리의 내용을 재귀적으로 나열하는 것은 약간 어렵지만 GNU 도구를 사용하면 다음과 같이 작동할 수 있습니다.
find . ! -perm /0222 -print0 | xargs -0 find
답변2
다른 도구를 사용해 보는 것이 좋습니다. Find 명령은 구문 규칙 중 일부를 익히면 매우 강력하고 사용하기 쉽습니다.
예:
찾기/디렉터리 -이름 패턴 -perm g=w -exec /bin/rm {} \;
그러면 "쓰기" 그룹 권한(0020 8진수 chmod 형식과 논리적으로 일치)이 있는 /directory 아래의 모든 파일과 하위 폴더를 검색한 다음 파일을 삭제합니다.
또는 인쇄 옵션을 사용하여 실행하고 찾기 패턴과 일치하는 파일 목록을 얻을 수 있습니다.
예: find/디렉토리 이름-패턴-perm 0111-print