예상한 파일이 반환되지 않은 것으로 나타났습니다.

예상한 파일이 반환되지 않은 것으로 나타났습니다.

특정 위치에서 대용량 파일을 찾으려고 합니다.

명령이 작동하고 일부 결과를 반환합니다.

admin@tyrell:~$ sudo find /nfshome/*/.local/ -type f -size +1G -exec ls -lh {} \;
-rw-r--r-- 1 9917183 students 5.2G Jun  5  2017 /nfshome/9917183/.local/share/Trash/files/result_25.zip
-rw-r--r-- 1 9918178 students 4.0G Sep  6  2018 /nfshome/9918178/.local/share/unity3d/Asset Store-5.x/Unity Technologies/Unity EssentialsSample Projects/3D Game Kit.unitypackage
-rw-r--r-- 1 9919185 students 2.1G Mar  6  2018 /nfshome/9919185/.local/share/Trash/files/agggg.avi
-rw-r--r-- 1 9919382 students 1.7G Jan 17  2017 /nfshome/9919382/.local/share/Trash/files/MageWar.avi
-rw-r--r-- 1 9921459 students 1.8G Apr 12 11:58 /nfshome/9921459/.local/share/Trash/files/takeout-20190412T182950Z-001(1).zip
-rw-r--r-- 1 9921459 students 1.8G Apr 12 11:58 /nfshome/9921459/.local/share/Trash/files/takeout-20190412T182950Z-001.zip
-rw-r--r-- 1 9921459 students 1.4G Apr 12 11:56 /nfshome/9921459/.local/share/Trash/files/takeout-20190412T182950Z-003.zip
-rw-r--r-- 1 9921459 students 1.4G Apr 12 11:58 /nfshome/9921459/.local/share/Trash/files/takeout-20190412T182950Z-003(1).zip

그러나 하위 디렉터리를 추가하여 검색 범위를 좁히려고 하면 share/아무 것도 얻지 못하지만 위의 모든 내용 때문에 정확히 동일한 결과를 얻을 것으로 예상했습니다 share/.

admin@tyrell:~$ sudo find /nfshome/*/.local/share/ -type f -size +1G -exec ls -lh {} \;
admin@tyrell:~$ 

find가 첫 번째 명령과 동일한 결과를 반환하지 않는 이유는 무엇입니까?

답변1

명령에서는 셸이 아닌 명령에만 sudo추가 권한을 부여합니다. find따라서 높은 곳에서 시작하면 find파일 트리 아래로 내려가 콘텐츠가 표시될 수 있습니다.

그러나 셸이 확장을 시도하고 있습니다 *. 사용자에게 검사 중인 콘텐츠에 대한 권한이 없으면 /nfshome/*/.local그 안에 있는 어떤 파일도 일치시킬 수 없습니다(예: /nfshome/*/.local/share). 일치하는 항목이 없으면 에 아무것도 전달되지 않습니다 find.

echo /nfshome/*/.localsum 의 출력을 검사하면 이를 확인할 수 있습니다 echo /nfshome/*/.local/share. 두 번째 항목은 비어 있을 수 있습니다.

아직 명확하지 않다첫 번째 명령이 작동하는 것처럼 보이면 두 번째 명령을 실행하려고 합니다. 서브셸에서 전체 명령을 실행하고 sudo.eg를 사용할 수 있습니다.sudo -c "find ..."

답변2

실패 이유는 권한 및 와일드카드와 관련이 있습니다 *. 다음과 같이 로컬 파일 시스템에서 이를 재현할 수 있습니다.

  1. 장면을 설정하기 위해 디렉토리 트리는 다음 위치에 있습니다 /tmp/top.

    sudo -s <<'x'
    mkdir -p /tmp/top/{a,b}/dir/sub/
    touch /tmp/top/{a,b}/dir/sub/file
    chown root /tmp/top/?/dir
    chmod go= /tmp/top/?/dir
    x
    
  2. 일반 사용자로서 다음 작업을 수행할 수 있는 권한이 없습니다 /tmp/top/*/dir.

    find /tmp/top/?/dir -type f
    find: ‘/tmp/top/a/dir’: Permission denied
    find: ‘/tmp/top/b/dir’: Permission denied
    
  3. 루트 권한으로 우리 디렉토리에서 내려와 보세요도착할 수 없습니다일반 사용자로서:

    sudo find /tmp/top/*/dir/sub -type f
    find: ‘/tmp/top/*/dir/sub’: No such file or directory
    

    명령이 실행되기 전에 쉘 와일드카드 평가가 수행된다는 점을 기억하십시오. 따라서 여기서 일어나는 일은 와일드카드가 포함된 경로가 *확장된다는 것입니다. 귀하의 일반 사용자 계정은 존재 여부를 확인할 수 없으므로 sub전체 경로를 확인할 수 없습니다. 와일드카드는 별표(일치 실패 시 기본 동작)로 남겨지며 내림차순 find리터럴 경로에는 루트 권한이 부여됩니다. /tmp/top/*/dir/sub경로가 존재하지 않으므로 오류가 발생합니다.

  4. 일반 사용자로 액세스할 수 있는 디렉터리부터 순서를 지정하려면 루트 권한을 사용해 보십시오.

    sudo find /tmp/top/*/dir -type f
    /tmp/top/a/dir/sub/file
    /tmp/top/b/dir/sub/file
    

    여기서도 비슷한 일이 발생하지만 더 유용한 결과를 얻습니다. /tmp/top/*/dir경로는 일반 사용자와 동일하게 평가될 수 있으므로 두 개의 경로 /tmp/top/a/dir합계가 생성됩니다 /tmp/top/b/dir. 이러한 파일은 권한이 있는 루트 디렉터리로 전달되며 find, 여기에서 루트 하위 디렉터리까지만 드릴다운하고 찾은 파일을 나열할 수 있습니다.

귀하의 경우 루트 권한이 없으면 와일드카드 경로의 디렉터리에 .local액세스할 수 없을 가능성이 높지만 더 높은 수준의 디렉터리에는 액세스할 수 있습니다. 일반 사용자 계정으로 평가할 수 있는 경로를 지정하면 find확장된 경로 집합을 계속 처리할 수 있습니다 . 일반 사용자 계정의 컨텍스트에서 평가할 수 없는 경로를 지정하면 확장이 실패하고 find리터럴 문자가 포함된 경로를 전달합니다 *. 물론 이것은 일치하지 않고 find실패합니다.

이 문제를 해결하려면 명령이 루트로 실행될 때까지 경로 평가를 연기하면 됩니다.

sudo bash -c "find /nfshome/*/.local/ -type f -size +1G -exec ls -lh {} \;"

관련 정보