쉘 스크립트 `rm -r`: 쓰기 방지 프롬프트를 리디렉션하고 "n"으로 응답합니다.

쉘 스크립트 `rm -r`: 쓰기 방지 프롬프트를 리디렉션하고 "n"으로 응답합니다.

디렉토리를 반복하고 일부 이름을 일치시키고 삭제하는 쉘 스크립트에 몇 줄이 있습니다. 파일 시스템의 특정 영역은 쓰기 금지되어 있습니다.이를 유지하고 싶지만 프롬프트나 오류에 대한 다른 표시를 로그로 리디렉션하고 싶습니다.그들이 만날 때.

스크립트의 이 시점에서 사용하면 rm -r /path/to/directory스크립트가 출력됩니다.

rm: descend into write-protected directory /path/to/directory/subdirectory?

따라서 자체 장치에 그대로 두면 작동이 중단되고 [결국] 시간 초과됩니다.

프롬프트에 "n"을 연결하여 이 동작을 수정해 보았습니다.

yes n | rm -rv /path/to/directory

이로 인해 두 가지 바람직하지 않은 결과가 발생합니다.

  1. yes: standard output: Broken pipe; yes: write error각 디렉토리 출력삭제되었으며,
  2. rm: descend into write-protected...메시지를 표준 출력으로 반환 하지 마십시오 .

이를 수행하는 올바른 방법은 무엇입니까?

고쳐 쓰다:yes n@roaima에 따르면 파이프가 있으면 대화형이 아니기 때문에 실제로 프롬프트를 전혀 파이핑하지 않습니다 rm. 실제로는 일부 출력을 얻기 위해 대화형 기능을 활용하고 있지만 대화형 기능을 끄면 프로그램이 오류와 함께 종료되기 때문에 이것은 아이러니합니다. 보호된 파일의 이름을 원하기 때문에 오류를 무시하고 싶지 않습니다(예: || trueSE의 다른 곳에서 많이 본 것처럼 추가).

답변1

rmstdin이 터미널인 경우 쓰기 불가능한 대상에 대한 확인이 요청됩니다. -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

관련 정보