특정 위치에서 대용량 파일을 찾으려고 합니다.
명령이 작동하고 일부 결과를 반환합니다.
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/*/.local
sum 의 출력을 검사하면 이를 확인할 수 있습니다 echo /nfshome/*/.local/share
. 두 번째 항목은 비어 있을 수 있습니다.
아직 명확하지 않다왜첫 번째 명령이 작동하는 것처럼 보이면 두 번째 명령을 실행하려고 합니다. 서브셸에서 전체 명령을 실행하고 sudo
.eg를 사용할 수 있습니다.sudo -c "find ..."
답변2
실패 이유는 권한 및 와일드카드와 관련이 있습니다 *
. 다음과 같이 로컬 파일 시스템에서 이를 재현할 수 있습니다.
장면을 설정하기 위해 디렉토리 트리는 다음 위치에 있습니다
/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
일반 사용자로서 다음 작업을 수행할 수 있는 권한이 없습니다
/tmp/top/*/dir
.find /tmp/top/?/dir -type f find: ‘/tmp/top/a/dir’: Permission denied find: ‘/tmp/top/b/dir’: Permission denied
루트 권한으로 우리 디렉토리에서 내려와 보세요도착할 수 없습니다일반 사용자로서:
sudo find /tmp/top/*/dir/sub -type f find: ‘/tmp/top/*/dir/sub’: No such file or directory
명령이 실행되기 전에 쉘 와일드카드 평가가 수행된다는 점을 기억하십시오. 따라서 여기서 일어나는 일은 와일드카드가 포함된 경로가
*
확장된다는 것입니다. 귀하의 일반 사용자 계정은 존재 여부를 확인할 수 없으므로sub
전체 경로를 확인할 수 없습니다. 와일드카드는 별표(일치 실패 시 기본 동작)로 남겨지며 내림차순find
리터럴 경로에는 루트 권한이 부여됩니다./tmp/top/*/dir/sub
경로가 존재하지 않으므로 오류가 발생합니다.일반 사용자로 액세스할 수 있는 디렉터리부터 순서를 지정하려면 루트 권한을 사용해 보십시오.
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 {} \;"