“find”에서“permission denied”메시지를 모두 제외하려면 어떻게해야합니까?


794

다음 에서 권한 거부 메시지를 모두 숨겨야합니다 .

find . > files_and_folders

그런 메시지가 나올 때 실험 중입니다. 발생하지 않는 모든 폴더와 파일을 수집해야합니다.

권한 수준을 files_and_folders파일로 지정할 수 있습니까?

동시에 오류를 숨기려면 어떻게해야합니까?

답변:


259

참고 :
*이 답변은 사용 사례보다 더 깊어 find 2>/dev/null질 수 있으며 많은 상황에서 충분할 수 있습니다. 크로스 플랫폼 관점과 가능한 한 강력한 솔루션을 찾는 데 관심이있는 일부 고급 쉘 기술에 대한 논의에 여전히 관심이있을 수 있습니다.
* 시스템이 현지화 된 오류 메시지 를 표시하도록 구성된 경우 영어 메시지가보고 되도록 find아래 의 호출 앞에 LC_ALL=C( LC_ALL=C find ...)를 붙이면 의도 한대로 작동합니다. 변함없이, 그러나, 오류 메시지 않습니다 표시 얻을는 영어로도됩니다. grep -v 'Permission denied'

귀하의 경우 쉘이 bashzsh , 거기에 합리적으로 간단하면서 강력 솔루션 사용, 단지 POSIX 호환 find기능 ; 반면 bashPOSIX의 일부가 아닌 자체, 가장 현대적인 유닉스 플랫폼은이 솔루션이 널리 휴대하고, 그와 함께 :

find . > files_and_folders 2> >(grep -v 'Permission denied' >&2)

참고 : 전체 명령이 내부 명령이 완료 grep될 때까지 기다리지 않기 때문에 일부 출력이 완료된 도착할 가능성이 적습니다 . 에서가 , 당신은 추가하여이 문제를 방지 할 수 있습니다 명령에.find>(...)bash| cat

  • >(...)A (거의 사용하지 않음)입니다 출력 프로세스 대체 (이 경우 출력을 리디렉션 허용, 표준 에러의 출력 ( 2>명령 내부의 표준 입력으로) >(...).
    에 추가 bash하고 zsh, ksh뿐만 아니라 지원을 원칙으로 하지만,에서 리디렉션을 결합하는 시도 여기에서 수행 된 stderr ( 2> >(...)) 은 자동으로 무시되는 것으로 보입니다 ( ksh 93u+).

    • grep -v 'Permission denied'구문을 포함하는 모든 명령 행 ( 명령의 stderr 스트림에서)을 필터링 하고 ( -v) 나머지 행을 stderr ( ) 로 출력합니다 .findPermission denied>&2

이 접근법은 다음과 같습니다.

  • strong : 오류 메시지grep 에만 적용되며 (파일 경로와 오류 메시지의 조합으로 인해 오 탐지로 이어질 수 있음) 권한이 거부 된 오류 이외의 오류 메시지는 stderr로 전달됩니다.

  • side-effect free : find의 종료 코드가 유지됩니다. 발생한 파일 시스템 항목 중 하나 이상에 액세스 할 수 없으면 종료 코드 가 발생합니다 (권한이 거부 된 1오류 이외의 오류가 발생했는지 여부는 알려지지 않음 ).


POSIX 호환 솔루션 :

완전히 POSIX 호환 솔루션에는 제한이 있거나 추가 작업이 필요합니다.

경우 find의 출력이 포착 될 파일 어쨌든 (또는 전부 억제), 다음에서 파이프 라인 기반 솔루션 조나단 레플러의 대답은 간단하고, 강력하고, POSIX 호환은 다음과 같습니다

find . 2>&1 >files_and_folders | grep -v 'Permission denied' >&2

다음 리디렉션 문제의 순서가 있습니다 2>&1와야 첫째 .

파일 앞쪽에 stdout 출력을 캡처 하면 파이프 라인을 통해 오류 메시지 2>&1 보낼 수 있으며 ,이 메시지 는 명확하게 작동 할 수 있습니다.grep

유일한 단점이다 전반적인 종료 코드가 될 것입니다 grep명령의 하지 find가없는 경우 :이 경우 수단에의, 아니 모든 또는 오류 허락-거부 오류, 종료 코드가 될 것이다 1(신호 실패 (그렇지 않으면) 권한 거부 오류 이외의 오류) 0-의도의 반대입니다.
그러나 find'종료 코드는 존재하지 않는 경로를 전달하는 것과 같은 근본적인 실패를 넘어 정보를 거의 전달하지 않기 때문에 어쨌든 거의 사용되지 않습니다 .
그러나 일부 의 경우에만입력 경로에 의한 권한의 부족으로 액세스가되는 됩니다 에 반영 find(GNU와 BSD 모두의 종료 코드 find) : 사용 권한 - 거부 오류가 발생하면 모든 처리 된 파일의 종료 코드로 설정됩니다 1.

다음과 같은 변형이 다음을 해결합니다.

find . 2>&1 >files_and_folders | { grep -v 'Permission denied' >&2; [ $? -eq 1 ]; }

이제 종료 코드는 다른 오류 Permission denied 발생 했는지 여부를 나타냅니다 ( 1그렇다면 0그렇지 않은 경우).
즉 : 성공 (: 종료 코드는 이제 명령의 진정한 의도를 반영하는 0) 모든 또는 오류 경우,보고 있는 권한 - 거부 오류가 발생하지합니다.
이것은 find상단의 솔루션에서와 같이 종료 코드를 전달하는 것보다 훨씬 낫습니다 .


gniourf_gniourf 코멘트에은 (여전히 POSIX 호환) 제안 정교한 리디렉션을 사용하여이 솔루션의 일반화 , 에 파일 경로 인쇄의 기본 동작으로도 작동 표준 출력 :

{ find . 3>&2 2>&1 1>&3 | grep -v 'Permission denied' >&3; } 3>&2 2>&1

한마디로 : 사용자 정의 파일 디스크립터 3는 stdout ( 1)과 stderr ( 2) 를 임시로 교환하는 데 사용 되므로 오류 메시지 grep stdout 을 통해 파이프 될 수 있습니다 .

이러한 경로 재 지정이 없으면 데이터 (파일 경로) 오류 메시지가 모두 grepstdout 을 통해 파이프되고 오류 메시지이름 이 문구 를 포함 하는 (가설) 파일grep 을 구별 할 수 없습니다 . Permission deniedPermission denied

최초의 솔루션과 마찬가지로, 그러나, 종료 코드가 될 것보고 grep의하지 find적용 할 수 있습니다 위와 같이의,하지만 같은 수정.


기존 답변에 대한 참고 사항 :

  • 에 대해 유의해야 할 몇 가지 포인트가 있습니다 마이클 Brux의 대답은 , find . ! -readable -prune -o -print:

    • GNU 가 필요합니다 find. 특히 macOS에서는 작동하지 않습니다. 물론, GNU와 함께 작동하는 명령 만 필요한 경우 find에는 문제가되지 않습니다.

    • 일부 Permission denied오류는 여전히 나타날 수 있습니다 . 현재 사용자에게는 권한이 있지만 실행 가능한 권한 이없는 디렉토리 find ! -readable -prune하위 항목에 대한 오류를보고합니다 . 그 이유는 디렉토리 자체 읽을 수 있고 실행되지 않기 때문에 해당 디렉토리 로 내려 가려고 하면 오류 메시지가 트리거 되기 때문입니다. 즉, 일반적인 경우는 권한이 누락 된 것입니다.rx-pruner

    • 참고 : 다음 사항은 철학 및 / 또는 특정 유스 케이스의 문제이며, 사용자와 관련이 없으며 특히 경로 를 인쇄 하는 것이 모든 경우 명령이 사용자의 요구에 적합하다고 결정할 수 있습니다 .

      • 권한 거부 오류 메시지의 필터링 을 임의의 명령 에 적용 할 별도의 작업으로 개념화하는 경우 권한 거부 오류 를 사전에 방지 하는 반대의 접근 방식 에서는 명령에 "노이즈"를 도입해야합니다. 복잡성과 논리적 함정 . findfind
      • 예를 들어 Michael의 답변에 대해 가장 많이 언급 된 의견 (이 글을 쓰는 시점) 은 다음과 같이 필터 를 포함하여 명령 을 확장 하는 방법을 보여 주려고합니다 -name.
        find . ! -readable -prune -o -name '*.txt'
        그러나 후행 작업이 필요 하므로 의도 한대로 작동 하지 않습니다. ( 이 답변 에서 설명을 찾을 수 있습니다 ). 이러한 미묘함은 버그를 유발할 수 있습니다.-print
  • 첫 번째 솔루션 조나단 레플러의 대답은 , find . 2>/dev/null > files_and_folders그 자신이 상태로, 맹목적으로 침묵 모든 오류 메시지를 (그리고 그는 또한 설명으로 해결 방법은 완전히 강력한 가시고하지 않습니다). 그러나 실용적으로 말하자면 모든 오류가 권한과 관련이 있다고 가정하는 것이 가장 간단한 해결책 입니다.

  • 안개의 대답은 , sudo find . > files_and_folders, 간결하고 실용적인,하지만 단지 이외의 아무것도 경솔한입니다 인쇄 파일 이름 보안상의 이유로 : 당신이로 실행하고 있기 때문에 루트 사용자, "당신은 발견 버그로 엉망이되고 전체 시스템을 위험을 감수 또는 악의적 인 버전, 또는 정상적인 권한으로이 작업을 실행 한 경우 (에 의해 안개의 대답에 코멘트에서 "일어날 수없는 예기치 않게 뭔가를 기록 잘못된 호출, tripleee ).

  • 에서 제 2 회 솔루션 viraptor의 대답은 , find . 2>&1 | grep -v 'Permission denied' > some_file그리고 잠재적으로 대신보고 (때문에 파이프 라인을 통해 표준 출력과 표준 에러의 혼합을 보내기) 잘못된 반응의 위험을 실행 출력 경로와 함께 캡처, 그들에게 열려진 통해 -permission-거부 오류 출력 파일에.


4
간단한 질문 : 왜 파이프가 아닌 프로세스 대체를 사용 find . 2>&1 > files_and_folders | grep -v 'Permission denied' >&2합니까?
gniourf_gniourf

2
@ LéoLéopoldHertz 준영 : 외부 파일로 출력하지 않으려면 더 많은 배관 작업을 수행하십시오.{ find . 3>&2 2>&1 1>&3 | grep -v 'Permission denied' >&3; } 3>&2 2>&1
gniourf_gniourf

2
@ LéoLéopoldHertz 준영 : POSIX와 호환됩니다. 프로세스 대체 >(...)는 Bash에 따라 다릅니다.
gniourf_gniourf

2
종료 코드의 보존 find이 강조되고 광고되어야한다는 것을 확신하지 못합니다 find. 종료 코드는 악명이 없습니다. 여기서는 0이 아닐 것입니다 (그리고 쓸모가 없습니다).
gniourf_gniourf

3
POSIX execute/search는 디렉토리를 '검색'하기 위해 파일 모드 권한을 명시 적으로 요구합니다 (포함 된 파일의 inode 검색). find하위 디렉토리로 내려 가기 위해 (디렉토리 read에 파일을 나열 하는 권한이 필요함 )이를 수행합니다. 이것은 '버그'또는 '포팅 오류'가 아닙니다.
wjordan

542

사용하다:

find . 2>/dev/null > files_and_folders

이것은 Permission denied물론 오류뿐만 아니라 모든 오류 메시지를 숨 깁니다 .

심볼릭 링크에 너무 많은 홉과 같은 다른 가능한 오류를 유지하고 싶지만 권한이 거부 된 것이 아니라면 'permission denied'라는 파일이 많지 않다는 추측을해야합니다. 시도해보십시오 :

find . 2>&1 | grep -v 'Permission denied' > files_and_folders

표준 오류 만 엄격하게 필터링하려면보다 정교한 구성을 사용할 수 있습니다.

find . 2>&1 > files_and_folders | grep -v 'Permission denied' >&2

find명령 의 I / O 리디렉션 은 다음과 같습니다 2>&1 > files_and_folders |.. 파이프는 표준 출력을 grep명령으로 리디렉션 하고 먼저 적용됩니다. 은 2>&1표준 출력 (파이프)와 같은 장소에 표준 오차를 보낸다. 는 > files_and_folders파일에 표준 출력 (그러나 표준없는 오류)을 보냅니다. 결과적으로 표준 오류에 기록 된 메시지가 파이프로 전송되고 일반 출력 find이 파일에 기록됩니다. 는 grep표준 출력이 최종 (당신은 당신이 원하는 선택, 및 로케일 및 O / S에 따라 철자를 변경해야 할 수 있습니다 방법을 결정할 수 있습니다) 필터>&2생존 오류 메시지 (표준 출력에 기록됨)가 표준 오류로 한 번 더 이동 함을 의미합니다. 최종 리디렉션은 터미널에서 선택 사항으로 간주 될 수 있지만 표준 오류에 오류 메시지가 표시되도록 스크립트에서 사용하는 것이 좋습니다.

수행하려는 작업에 따라이 테마에는 끝없는 변형이 있습니다. 이것은 Bourne 쉘 파생물 (Bash, Korn,…) 및 POSIX 호환 버전의 모든 Unix 변형에서 작동합니다 find.

find시스템에 있는 특정 버전에 적응하려면 대체 옵션을 사용할 수 있습니다. find특히 GNU 에는 다른 버전에서는 사용할 수없는 수많은 옵션이 있습니다. 이러한 옵션 중 하나에 대해서는 현재 허용되는 답변을 참조하십시오.


9
당신이 나와 같다면 공간 부족이 중요하다는 것을 주목하십시오! 2>/dev/null공간없이!
Nik

20
2>공백없이 하나의 단위이고; 파일 이름과 파일 이름 사이에 공백이있을 수 있습니다. 2>&1(표준 오류를 표준 출력과 같은 위치로 리디렉션하거나) 2>&-표준 오류를 닫는 등의 다른 리디렉션과 유사 합니다. 나머지 gory 세부 사항 은 리디렉션 을 참조 하십시오. (위의 코드에 대한 일반적인 POSIX와 같은 쉘이 아닌 특정입니다 bash.)
조나단 레플러

3
터미널에서 출력하는 것이기 때문에 대문자 P를 사용해야했습니다. 2> & 1 | 그렙 -v '권한이 거부'
데이비드 도리아에게

4
이것이 어떻게 수용 가능한 솔루션입니까? 1) 모든 오류를 dev / null로 리디렉션하고 있습니다. 2) 명시 적 오류 문자열을 필터링하고 있습니다 !! 이것에 따라 잘 부서지기 쉽고 파일이 'permission denied'라는 디렉토리에 있다면? 죄송합니다!
Gunchars

10
프로그램의 출력을 수정하기 위해 grepping 오류 문자열에 반대합니다. 대부분의 경우 작동하지만 간단한 해결책은 올바른 해결책이 아닙니다 (아래의 파마로 찾기). 이유를 설명하기 위해 오류가 "Permission denied"이므로 OSX에서 작동하지 않습니다. 오류 문자열에 약간의 차이가있는 다른 시스템에서도 마찬가지입니다 (국제화는 누구입니까?)
Gunchars

285

사용하다:

find . ! -readable -prune -o -print

또는 더 일반적으로

find <paths> ! -readable -prune -o <other conditions like -name> -print
  • "권한 거부"를 피하기 위해
  • AND (기타) 오류 메시지를 표시하지 마십시오
  • 종료 상태 0을 얻습니다 ( "모든 파일이 성공적으로 처리되었습니다").

작동 : find (GNU findutils) 4.4.2. 배경:

  • -readable테스트 읽을 파일을 일치합니다. !테스트가 false 인 경우 연산자는, true를 돌려줍니다. ! -readable읽을 수없는 디렉토리 (& 파일) 와 일치합니다.
  • -prune조치는 디렉토리로 내려하지 않습니다.
  • ! -readable -prune 디렉토리를 읽을 수없는 경우 디렉토리로 내려 가지 마십시오.
  • -readable테스트 계정 액세스 제어 목록과 다른 권한 유물에 걸리는 -perm테스트 무시합니다.

자세한 내용은 find(1) 맨 페이지 를 참조하십시오.


6
차이점은 이미 언급되었습니다. 당신이 이해하지 않는다면, 대답은 당신에게 아무런 영향을 미치지 않을까요? STDOUT은 동일합니다-STDERR이 다릅니다 (이 답변과 함께 다른 오류 메시지가 표시됨)-$? 다른 오류 (다른 오류가 발생하지 않을 때이 대답으로 0 "성공"입니까-dev / null로 리디렉션 할 때 항상> 0 "성공하지 않음")-누군가 "정확한"$가 필요할까요? 스크립트에서
Michael Brux

6
@ 가장 명백한 결함은 Jonathan의 답변입니다 (grep -v) 'Permission denied'가 포함 된 파일 이름을 제외합니다 :)
Fruit

65
다른 검색 기준을 추가해야하는 경우 다음과 -o같이 수행해야한다고 여기에 추가하는 것이 적절하다고 생각합니다 .find . ! -readable -prune -o -name '*.txt'
tempestadept

22
POSIX find-readable옵션으로 포함되지 않습니다 . findBSD와 Mac OS X 도 마찬가지입니다 (다른 시스템에 대해서는 잘 모르겠습니다). 따라서 GNU가 find보장 되는 곳에서는 훌륭하게 작동하지만 시스템에 GNU가 find설치되어 있음을 보장 할 수없는 경우이를 어떻게 적용할지는 분명하지 않습니다 . (Linux에서는 잘 작동하지만 다른 곳에서는 작동하지 않을 수도 있습니다.)
Jonathan Leffler 2016 년

6
find . ! -readable -prune -o -name '*.txt'find 4.2.2를 사용하여 Ubuntu 14.04에서 작동하지 않는 것 같습니다. 그것은 ingore 것 같다 -name. 어떤 이상한 이유로 나는 성공이find . \( ! -readable -prune \) -o -name '*.txt' -print
사기꾼 - F-사용

110

루트 "/"에서 검색을 시작하려면 다음과 같은 출력이 표시 될 것입니다.

find: /./proc/1731/fdinfo: Permission denied
find: /./proc/2032/task/2032/fd: Permission denied

허가 때문입니다. 이 문제를 해결하려면

  1. sudo 명령을 사용할 수 있습니다 :

    sudo find /. -name 'toBeSearched.file'

슈퍼 사용자의 암호를 묻습니다. 암호를 입력하면 원하는 결과가 표시됩니다. sudo 명령을 사용할 수있는 권한이없는 경우 수퍼 유저 암호가없는 경우 먼저 시스템 관리자에게 sudoers 파일에 추가하도록 요청하십시오.

  1. (일반적으로 디스플레이 / 스크린)의 표준 오류 출력을 일부 파일로 리디렉션하고 화면에 오류 메시지가 표시되지 않도록 할 수 있습니다! 특수 파일 / dev / null로 리디렉션하십시오.

    find /. -name 'toBeSearched.file' 2>/dev/null
  2. 표준 오류 출력을 (일반적으로 표시 / 화면)에서 표준 출력 (일반적으로 표시 / 화면)으로 재 지정한 다음 grep 명령을 -v "invert"매개 변수와 함께 파이프하여 'Permission denied'가있는 출력 행을 표시하지 않을 수 있습니다. 단어 쌍 :

    find /. -name 'toBeSearched.file' 2>&1 | grep -v 'Permission denied'

7
@scottmrogowski는 질문에 답하지 않는 것을 제외하고 ... 1. 시스템 관리자에게 sudoers 파일에 추가하도록 요청하십시오. 2.sudo find...
스티븐

1
정확히 내가 찾던 것!
DankMasterDan

92

나는 사용해야했다 :

find / -name expect 2>/dev/null

찾고자하는 이름을 지정한 다음 모든 오류를 / dev / null로 리디렉션하도록 지시합니다.

내가 찾던 기대 프로그램의 위치가 될 것으로 기대하십시오.


3
@Masi, 답변의 명령은을 사용하지 않습니다 expect. 대신 expect이 명령이 찾으려는 파일의 이름입니다.
Dhruv Kapoor 8:10에

2
단일 클래스의 오류 메시지를 무시하기 위해 모든 stderr 출력을 맹목적으로 리디렉션하는 것은 일반적으로 나쁜 생각입니다. 프로세스에서 다른 모든 임의의 오류가 손실됩니다.
Josip Rodin

59

파이프 stderr/dev/null사용하여 2>을 / dev / null을

find . -name '...' 2>/dev/null


2
이것은 Mac OSX에서도 잘 작동합니다. 또는 심지어find . -name '...' -print 2>/dev/null
shadowsheep

30

당신은 또한 사용할 수 있습니다 -perm-prune(참조 읽을 디렉토리로 내려 피하기 위해 조건을 ? 내가 찾기 프로그램에서 출력 문 "권한이 거부"를 제거하려면 어떻게 - 유닉스 및 리눅스 스택 교환 ) :

find . -type d ! -perm -g+r,u+r,o+r -prune -o -print > files_and_folders

4
-perm -g+r,u+r,o+r파일의r 모든 보안 주체에 대해 (읽기) 권한이 설정된 파일과 일치 하며, 현재 사용자 가 해당 파일을 읽을 수 있는지 여부와 직접적인 관계가 없습니다. 현재 사용자 읽을 있는 파일을 놓칠 수없고 읽을 수없는 파일과 일치시킬 가능성이 있습니다.
mklement0

find . -type d ! \( -perm -u+r -o -perm -g+r -o -perm -o+r \) -prune -o -print좋은 해결책 이라고 생각 합니다.
Mattia72

2
@ Mattia72 : 아니요, 완전히 에뮬레이션 -readable하는 것은 불가능합니다. -perm이전 주석을 참조 하고이 예제를 고려하십시오 : 사용자 읽기 비트가 설정되어 있기 때문에 echo 'hi' > file; sudo chown nobody:nobody file; sudo chmod o-r file; find file -perm -u=rprints file이지만 nobody현재 사용자가 아닌 사용자와 관련이 있습니다. 현재 사용자는이 파일을 읽을 수 없습니다. 시도하십시오 cat file. 이 답변 도 참조하십시오 .
mklement0

23

표준 오류를 리디렉션하십시오. 예를 들어, 유닉스 머신에서 bash를 사용하는 경우 다음과 같이 표준 오류를 / dev / null로 리디렉션 할 수 있습니다.

find . 2>/dev/null >files_and_folders

20

Mac OS X -readable은 스위치를 지원하지 않기 때문에 위의 접근 방식은 Mac OS X의 경우를 해결하지 않지만 출력에서 '권한 거부'오류를 피할 수있는 방법입니다. 이것은 누군가를 도울 수 있습니다.

find / -type f -name "your_pattern" 2>/dev/null.

find예를 들어, 디렉토리에서 특정 패턴의 파일 크기를 찾기 위해 다른 명령을 사용하는 경우 2>/dev/null여전히 아래에 표시된 것처럼 작동합니다.

find . -type f -name "your_pattern" -exec du -ch {} + 2>/dev/null | grep total$.

주어진 패턴의 파일의 전체 크기를 반환합니다. 2>/dev/nullfind 명령의 끝에 유의하십시오 .


OS X에 대한 좋은 바인딩! Jonathan의 대답은 그 부분을 설명합니다 2>/dev/null. 그 부분을 설명해 주시겠습니까 -exec du -ch {} + 2>/dev/null | grep total$?
Léo Léopold Hertz 준영

1
@Masi -exec옵션 과 함께 모든 명령을 사용하여 명령으로 찾은 파일 또는 디렉토리에 대한 추가 조치를 수행 할 수 있습니다 find. du -ch file_pattern일치하는 각 파일의 크기를 계산하고 file_pattern해당 출력의 마지막 행은에 일치하는 모든 파일의 총계입니다 file_pattern. 에 대한 매뉴얼 페이지를 참조하십시오 du. grep total총계 (마지막 행)를 추출하는 행만 필터링하면됩니다.
Bunti

13

이러한 오류는 표준 오류 출력 (fd 2)으로 인쇄됩니다. 이를 필터링하려면 모든 오류를 / dev / null로 리디렉션하십시오.

find . 2>/dev/null > some_file

또는 먼저 stderr 및 stdout에 가입 한 다음 해당 특정 오류를 제거하십시오.

find . 2>&1 | grep -v 'Permission denied' > some_file

11

간단한 답변 :

find . > files_and_folders 2>&-

2>&--표준 오류 파일 디스크립터 ( 2)를 닫아 ( ) 모든 오류 메시지가 침묵되도록합니다.

  • 1' Permission denied'오류가 인쇄되지 않으면 종료 코드는 계속 표시 됩니다.

GNU에 대한 강력한 답변 find:

find . -type d \! \( -readable -executable \) -prune -print -o -print > files_and_folders

에 추가 옵션을 전달 find하는 -prune(로 하강 방지)하지만 여전히 -print디렉토리 ( (없음) ) 모두가 및 권한, 또는 ( ) 다른 파일을.-typed\!-readable-executable-o-print

  • -readable-executable옵션은 GNU의 확장의 일부가 아닌 POSIX 표준은
  • Permission denied비정상 / 손상 파일에서 여전히 ' '를 반환 할 수 있습니다 (예 : <v2.0.5를 사용하는 컨테이너 마운트 파일 시스템에 영향을주는 버그 보고서 참조 lxcfs)

POSIX 호환 find(GNU, OSX / BSD 등)에서 작동하는 강력한 답변

{ LC_ALL=C find . 3>&2 2>&1 1>&3 > files_and_folders | grep -v 'Permission denied'; [ $? = 1 ]; } 3>&2 2>&1

파이프 라인 을 사용 하여 표준 오류 스트림을에 전달 grep하여 'Permission denied'문자열을 포함하는 모든 행을 제거하십시오 .

LC_ALL=C설정한다 POSIX 로케일 사용 환경 변수 , 3>&2 2>&1 1>&3그리고 3>&2 2>&1 중복 파일 디스크립터 파이프로 표준 에러 스트림 grep[ $? = 1 ]용도 []에 의해 반환 된 에러 코드를 반전하는 grep원래의 동작을 근사화 find.

  • 또한 'Permission denied'출력 리디렉션으로 인한 오류를 필터링합니다 (예 : files_and_folders파일 자체가 쓰기 가능하지 않은 경우 )

JordiFerran의 답변 제안에 대해 어떻게 생각하십니까? --당신은 그것에 대한 답변을 비교할 수 있습니까?
Léo Léopold Hertz 준영

2
명시된 답변의 쉘 스크립트는 범용이 아니며 ($ {m_find_name}과 일치하는 디렉토리 만 나열) 질문과 관련이없는 여러 옵션 (nice, / home *, -maxdepth 5, -follow)을 포함합니다. 이 답변은 범용으로 유지하면서 '판독 가능하지만 실행 가능한 디렉토리 필터링'과 관련된 문제를보다 간결하게 해결합니다.
wjordan

1
@ wjordan : 감사합니다. 나는 내 의견을 삭제했지만, 하나의 포인트는 계속 적용하십시오 -perm기반 솔루션의 가치 제시하지, 더 근본적으로 견적이 시사하는 것보다 뭔가 않기 때문에 다른를 의도 한 것보다 : 그것은 순전히 파일 중심 받는 관련된 테스트 파일의 소유자 그룹은 명령을 호출하는 사용자와 어떤 관계도 보장하지 않습니다 ( 이 답변 참조) . 수정 된 GNU 솔루션이 파일 에서 발생하는 권한 거부 오류를 포착하지 못하는 것 같습니다 .
mklement0

사용중인 구문을 인식하지 못하지만 (GNU도 아니고 BSD도 아닙니다), 사용자 읽기 비트가 설정되어 있기 때문에 자체 포함 된 예 : echo 'hi' > file; sudo chown nobody:nobody file; sudo chmod o-r file; find file -perm -u=rprints로 내 요점을 설명하겠습니다.하지만 file사용자와 관련이 nobody있습니다. 현재 사용자가 아닙니다. 현재 사용자는이 파일을 읽을 수 없습니다. 시도하십시오 cat file.
mklement0

1
@ mklement0 토론에 감사드립니다. 다른 테스트에서 설명한 동작을 만들었습니다 (처음에 내가 잘못한 것을 모르는 경우) -perm. 사용자의 현재 권한을 결정하는 데 효과가없는 것 같습니다 . 이 답변에서 해당 대안을 제거했습니다.
wjordan

4

권한 거부 경고 피하려면 찾기에서 읽을 수없는 파일을 잘라내어 무시하도록 find에 지시하십시오. 찾기에 OR로 표현식을 추가하십시오.

find / \! -readable -prune -o -name '*.jbd' -ls

이것은 (읽을 수없는 파일과 일치시키고 목록에서 정리) OR ( * .jbd 같은 이름을 일치시키고 [ls]로 표시)라고 말합니다 . (또는-를 사용하지 않는 한 기본적으로 표현식은 AND로 묶여 있음을 기억하십시오.) 두 번째 표현식에 -ls가 필요하거나 find가 일치하는 항목을 표시하는 기본 조치를 추가하면 읽을 수없는 파일도 모두 표시됩니다. .

그러나 시스템에서 실제 파일을 찾는 경우 일반적으로 많은 파일이 많은 / dev를 찾을 이유가 없으므로 다음과 같이 해당 디렉토리를 제외하는 표현식을 추가해야합니다.

find / -mount \! -readable -prune  -o  -path /dev -prune  -o  -name '*.jbd' -ls

따라서 (읽을 수없는 파일과 일치하고 목록에서 정리) OR (경로 / dev 및 목록에서 제거) 또는 ( * .jbd 같은 파일을 일치 시키고 표시하십시오) .


4

사용하다

sudo find / -name file.txt

그것은 어리 석고 (검색을 높이기 때문에) 안전하지 않지만 쓰기는 훨씬 짧습니다.


여기에서 전체 파일 시스템을 검색하므로 "검색 향상"을 의미합니다. 안전하지 않은 이유는 무엇입니까? 전체 파일 시스템을 검색하고 있기 때문에?
Léo Léopold Hertz 준영

2
sudo는 루트 권한으로 find 명령을 실행하기 때문에 기본적으로 나쁜 생각입니다. 분리 및 최소 권한 원칙을 위반합니다.
안개

3
여기서 "고도"는 루트 권한을 가진 권한입니다 sudo. 버그 find나 악의적 인 버전 으로 인해 시스템 전체가 엉망이 되거나 예상치 못한 무언가를 작성하는 잘못된 호출로 인해 정상적인 권한으로이를 실행하면 발생할 수 없습니다.
tripleee dec 7'15

2

위의 답변 중 어느 것도 나를 위해 일하지 않았습니다. 인터넷에서 찾은 내용은 오류 숨기기입니다. 프로세스 리턴 코드 / 종료 코드를 올바르게 처리하지 않습니다. bash 스크립트 내에서 find 명령을 사용하여 일부 디렉토리를 찾은 다음 내용을 검사합니다. 종료 코드를 사용하여 명령 찾기 성공을 평가합니다. 값이 0이면 그렇지 않으면 실패합니다.

위에 제공 대답 에 의해 마이클 Brux은 가끔 작동합니다. 그러나 실패한 시나리오가 하나 있습니다! 나는 문제를 발견하고 스스로 고쳤다. 다음과 같은 경우 파일을 정리해야합니다.

it is a directory AND has no read access AND/OR has no execute access

여기에서 주요 이슈를 확인하십시오 : AND / OR. 내가 읽은 좋은 권장 조건 순서는 다음과 같습니다.

-type d ! -readable ! -executable -prune

항상 작동하지는 않습니다. 이는 일치가 다음과 같은 경우 제거가 트리거됨을 의미합니다.

it is directory AND no read access AND no execute access

읽기 액세스 권한이 부여되었지만 실행 액세스 권한이없는 경우이 표현식 시퀀스가 ​​실패합니다.

몇 가지 테스트 후 나는 그것에 대해 깨달았고 쉘 스크립트 솔루션을 다음과 같이 변경했습니다.

좋은 찾기 / home * / -maxdepth 5 -follow \
    \ (-type d -a ! \ (-readable -a-executable \) \) -prune \
    -o \
    \ (-type d -a -readable -a- 실행 파일 -a -name "$ {m_find_name}"\) -print

여기서 핵심은 결합 된 표현식에 "true"가 아닌 것을 배치하는 것입니다.

has read access AND has execute access

그렇지 않으면 전체 액세스 권한이 없습니다. 즉 정리하십시오. 이것은 이전에 제안 된 솔루션이 실패한 시나리오에서 저에게 효과적이었습니다.

의견 섹션에 질문에 대한 기술적 세부 사항을 아래에 제공합니다. 세부 정보가 과도하면 죄송합니다.

  • ¿ 왜 좋은 명령을 사용합니까? 나는 여기서 아이디어를 얻었다 . 처음에는 전체 파일 시스템을 볼 때 프로세스 우선 순위를 줄이는 것이 좋을 것이라고 생각했습니다. 내 스크립트가 몇 개의 디렉토리로 제한되어 있기 때문에 이해가되지 않는다는 것을 깨달았습니다. -maxdepth를 3으로 줄였습니다.
  • ¿ 왜 / home * /에서 검색합니까? 이 스레드와 관련이 없습니다. 권한이없는 사용자 (루트 아님)와 소스 코드 컴파일을 통해 모든 응용 프로그램을 직접 설치합니다. "/ home"내에 설치됩니다. 여러 바이너리와 버전을 함께 사용할 수 있습니다. 모든 디렉토리를 찾고, 마스터-슬레이브 방식으로 검사 및 백업해야합니다. 하나 이상의 "/ 홈"(전용 서버 내에서 실행되는 여러 디스크)을 가질 수 있습니다.
  • ¿ 왜 -follow를 사용합니까? 사용자는 디렉토리에 대한 심볼릭 링크를 만들 수 있습니다. 유용성에 따라 절대 경로를 기록해야합니다.

당신의 대답과 좋은 관찰에 감사드립니다! 답변을 더 잘 미리보기 위해 현상금을 개설했습니다. 읽기 및 실행 액세스를 방해하지 않는 것이 좋은 발견이라고 생각합니다. - - 당신이 사용하는 이유를 설명해 주시겠습니까 nicefind $HOME -maxdepth 5 -follow ...?
Léo Léopold Hertz 준영

2
언급 한 바와 같이 쉘 스크립트는 범용 (목록 만 디렉토리 일치하지 않습니다 ${m_find_name}), 그리고 질문에 관련이없는 몇 가지 옵션이 포함되어 있습니다 ( nice, /home*, -maxdepth 5, -follow). 나는 일반적인 목적을 유지하면서 '읽을 수 있지만 실행 가능한 디렉토리를 필터링하지 않음'이라는 특정 문제를보다 간결하게 해결하는 답변을 추가했습니다.
wjordan

2

grep -v invert-match를 사용할 수 있습니다

-v, --invert-match        select non-matching lines

이처럼 :

find . > files_and_folders
cat files_and_folders | grep -v "permission denied" > files_and_folders

마법에


2

-= MacOS의 경우 =-

별명을 사용하여 새 명령을 작성하십시오. ~ / .bash_profile 행에 추가하십시오.

alias search='find / -name $file 2>/dev/null'

그리고 새로운 터미널 창에서 그것을 호출 할 수 있습니다 :

$ file=<filename or mask>; search

예를 들면 다음과 같습니다.

$ 파일 = 등; 검색


1

CSH 또는 TCSH를 사용하는 경우 해결책은 다음과 같습니다.

( find . > files_and_folders ) >& /dev/null

터미널로 출력하려면 :

( find . > /dev/tty ) >& /dev/null

그러나 "csh-whynot"FAQ에 설명 된대로 CSH를 사용해서는 안됩니다.


모든 txt 파일을 grep하고 숨겨진 파일 / 디렉토리를 제외하고 인쇄 할 "Permission denied"메시지를 생략하고 싶습니다. csh shell을 사용하고 있습니다. 아래 명령을 사용했는데 find 작동하지 않습니다. -type f -iname " .txt"-not -path '* / \. '| egrep -v "권한이 거부되었습니다"찾기. -type f -iname " .txt"-not -path '* / \. '2> / dev / null 오류가 발생합니다. 찾기 : 경로가 식 앞에 와야합니다. 2 사용법 : find [-H] [-L] [-P] [-Olevel] [-D help | tree | search | stat | rates | opt | exec] [path ...] [표현]
yadav
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.