찾기를 사용하는 것보다 특정 파일을 찾는 더 빠른 방법이 있습니까?

찾기를 사용하는 것보다 특정 파일을 찾는 더 빠른 방법이 있습니까?

특정 권한(755)이 없는 폴더에서 파일을 찾아야 합니다. 이 하위 디렉터리에는 총 수백만 개의 파일이 포함된 다른 하위 디렉터리가 있으며 find ./ -not -perm 755명령이 너무 오래 걸립니다.

이 작업을 수행하는 데 더 효율적이고 빠른 명령이 있습니까(예: ls와 grep 등의 결합)?

답변1

사용하는 경우 ls -lR어떻게든 출력에서 ​​항목을 제외하고 grep원하는 것을 출력해야 합니다.

find아마도 더 빠를 것입니다. 여기 내 컴퓨터에 대한 매우 빠른 해킹이 있습니다(그들은 grep못생겼고 자랑스럽지도 않습니다).

tony@trinity:~$ time ls -lR | grep "tony tony" | grep -vc "rwxr-xr-x"
115668

real    0m3.247s
user    0m1.456s
sys     0m1.808s
tony@trinity:~$ time find ./ -not -perm 755 | wc -l
125185

real    0m0.503s
user    0m0.120s
sys     0m0.380s
tony@trinity:~$ time ls -lR | grep "tony tony" | grep -vc "rwxr-xr-x"
115668

real    0m3.128s
user    0m1.564s
sys     0m1.920s
tony@trinity:~$ time find ./ -not -perm 755 | wc -l
125185

real    0m0.501s
user    0m0.196s
sys     0m0.428s

몇 가지 참고사항:

  • 캐시 차이의 가능성을 없애기 위해 이 두 명령을 두 번 실행했습니다.
  • 그들이 다른 개수를 반환한다는 것을 알 수 있을 것입니다. 나의 빠른 해킹 grep은 관련 파일과 디렉토리 항목만 분리하는 데 충분하지 않았습니다.
  • 이것의 목적은 더 나은 솔루션을 보여주기 위한 것이 아니라 findraw+에 비해 상당히 빠르다는 것을 보여주기 위한 것입니다.lsgrep

perl예를 들어 더 빠른 솔루션 이나 더 빠르게 실행되도록 하는 방법이 있을 수 있습니다 ls(설정 $LANG? - 내 테스트에서는 이 결과가 두 번째로 적은 출력으로 표시됩니다 . 정렬하지 말라고 ls말할 수도 있습니다 . 도움이 될 수 있습니다. ls).

편집: 방금 귀하의 댓글을 보고 권한을 변경해야 한다고 말씀하셨습니다. 이 경우 find모든 것을 한 번에 수행하기 때문에 확실히 정답입니다.

find ./ -not -perm 755 -exec chmod 755 {} \;

당신은해야매우 조심스럽다이 명령을 실행할 때 올바른 위치에 있는지 확인하십시오. 더 안전한 옵션은,

find /actual/full/path -not -perm 755 -exec chmod 755 {} \;

따라서 잘못된 위치에 있는 경우 시스템의 모든 파일이 변경되는 것을 방지할 수 있습니다.

또한 소프트 링크, 디렉터리 및 비정규 파일을 고려하고 find이에 따라 파일을 수정해야 합니다. 따라서 파일에만 관심이 있다고 가정하면 다음부터 시작하겠습니다.

find /actual/full/path -type f -not -perm 755 -exec chmod 755 {} \;

마지막으로 디렉토리 또는 디렉토리 그룹에 있는 모든 파일에 대한 권한을 755에서 755로 변경하려는지 자문해 보면 복잡한 작업을 수행할 필요가 없습니다.

find /actual/full/path -type f -exec chmod 755 {} \;

그러면 모두 755로 설정됩니다. 조금 더 빠를 수 있습니다(업데이트할 파일을 선택하는 논리와 수백만 개의 파일에 대한 권한을 업데이트하는 논리가 적습니다. 이는 이미 올바른 파일 수에 따라 달라집니다).

답변2

모든 파일과 디렉터리에 대해 755 권한을 가지려는 경우 재귀적으로 chmod를 수행하면 됩니다.

chmod -R 755 $directory

파일이 모드 644가 되어야 한다면 더 나을 수도 있습니다.

chmod -R u=rwX,go=rw $directory

이는 단일 프로세스를 사용하여 필요한 파일을 찾고 필요한 경우 해당 권한을 업데이트합니다.


다른 이유로 다른 권한을 가진 파일을 찾아야 하는 경우 이것이 find최선의 선택이 될 것입니다.

답변3

mlocate가 설치되어 있으면 더 쉽지만 파일 이름의 일부를 아는 경우에만 가능합니다. 또한 mlocate.db 파일에 대한 권한을 변경하지 않는 한 루트 권한이 필요합니다.

설치 후에는 cron 작업을 주기적으로 실행하여 mlocate 데이터베이스를 업데이트해야 합니다. 또는 Updateb를 실행하여 이 작업을 수동으로 수행할 수 있습니다. 일단 위치 명령을 사용하십시오.

관련 정보