TLDR : 루트 디렉토리를 이해하고 -path <excluded_path> -prune -o
옵션을 사용하여 검색을 조정하십시오 . /
제외 된 경로의 끝에 후행 을 포함하지 마십시오 .
예:
find / -path /mnt -prune -o -name "*libname-server-2.a*" -print
효과적으로 사용하려면 find
파일 시스템 디렉토리 구조를 잘 이해해야합니다. 가정용 컴퓨터에는 멀티 TB 하드 드라이브가 있으며 그 중 절반은 rsnapshot
(예 :)를 사용하여 백업됩니다 rsync
. 물리적으로 독립적 인 (중복) 드라이브로 백업하지만 시스템 루트 ( /
) 디렉토리에 마운트됩니다 . /mnt/Backups/rsnapshot_backups/
:
/mnt/Backups/
└── rsnapshot_backups/
├── hourly.0/
├── hourly.1/
├── ...
├── daily.0/
├── daily.1/
├── ...
├── weekly.0/
├── weekly.1/
├── ...
├── monthly.0/
├── monthly.1/
└── ...
/mnt/Backups/rsnapshot_backups/
디렉토리는 현재 60M 파일 및 폴더 ~와 함께, ~ 2.9 TB를 차지; 해당 내용을 순회하는 데 시간이 걸립니다.
## As sudo (#), to avoid numerous "Permission denied" warnings:
time find /mnt/Backups/rsnapshot_backups | wc -l
60314138 ## 60.3M files, folders
34:07.30 ## 34 min
time du /mnt/Backups/rsnapshot_backups -d 0
3112240160 /mnt/Backups/rsnapshot_backups ## 3.1 TB
33:51.88 ## 34 min
time rsnapshot du ## << more accurate re: rsnapshot footprint
2.9T /mnt/Backups/rsnapshot_backups/hourly.0/
4.1G /mnt/Backups/rsnapshot_backups/hourly.1/
...
4.7G /mnt/Backups/rsnapshot_backups/weekly.3/
2.9T total ## 2.9 TB, per sudo rsnapshot du (more accurate)
2:34:54 ## 2 hr 35 min
따라서 /
(루트) 파티션에서 파일을 검색해야 할 때마다 백업 파티션 통과를 처리해야합니다 (가능한 경우 피하십시오).
실시 예
이 스레드에서 다양하게 제안 된 접근법 중 ( find. 명령에서 디렉토리를 제외하는 방법 ), 나는 받아 들여진 대답을 사용하는 검색 이주의를 기울 이면 훨씬 빠릅니다.
해결책 1
시스템 파일을 찾고 libname-server-2.a
싶지만 rsnapshot
백업 을 검색하고 싶지 않다고 가정 해 봅시다 . 시스템 파일을 빨리 찾으려면 제외 경로를 사용하십시오 /mnt
(예 : /mnt
, not /mnt/
, 또는 /mnt/Backups
, 또는 ... 사용).
## As sudo (#), to avoid numerous "Permission denied" warnings:
time find / -path /mnt -prune -o -name "*libname-server-2.a*" -print
/usr/lib/libname-server-2.a
real 0m8.644s ## 8.6 sec <<< NOTE!
user 0m1.669s
sys 0m2.466s
## As regular user (victoria); I also use an alternate timing mechanism, as
## here I am using 2>/dev/null to suppress "Permission denied" warnings:
$ START="$(date +"%s")" && find 2>/dev/null / -path /mnt -prune -o \
-name "*libname-server-2.a*" -print; END="$(date +"%s")"; \
TIME="$((END - START))"; printf 'find command took %s sec\n' "$TIME"
/usr/lib/libname-server-2.a
find command took 3 sec ## ~3 sec <<< NOTE!
... 발견이 단 몇 초 파일이 걸릴는 동안 더 이상 (이하 "제외"모든 디렉토리를 재귀 것처럼 보이는) :
## As sudo (#), to avoid numerous "Permission denied" warnings:
time find / -path /mnt/ -prune -o -name "*libname-server-2.a*" -print
find: warning: -path /mnt/ will not match anything because it ends with /.
/usr/lib/libname-server-2.a
real 33m10.658s ## 33 min 11 sec (~231-663x slower!)
user 1m43.142s
sys 2m22.666s
## As regular user (victoria); I also use an alternate timing mechanism, as
## here I am using 2>/dev/null to suppress "Permission denied" warnings:
$ START="$(date +"%s")" && find 2>/dev/null / -path /mnt/ -prune -o \
-name "*libname-server-2.a*" -print; END="$(date +"%s")"; \
TIME="$((END - START))"; printf 'find command took %s sec\n' "$TIME"
/usr/lib/libname-server-2.a
find command took 1775 sec ## 29.6 min
해결책 2
이 스레드에서 제공되는 다른 솔루션 ( SO # 4210042 )도 성능이 좋지 않습니다.
## As sudo (#), to avoid numerous "Permission denied" warnings:
time find / -name "*libname-server-2.a*" -not -path "/mnt"
/usr/lib/libname-server-2.a
real 33m37.911s ## 33 min 38 sec (~235x slower)
user 1m45.134s
sys 2m31.846s
time find / -name "*libname-server-2.a*" -not -path "/mnt/*"
/usr/lib/libname-server-2.a
real 33m11.208s ## 33 min 11 sec
user 1m22.185s
sys 2m29.962s
요약 | 결론
" 솔루션 1 "에 설명 된 방법을 사용하십시오.
find / -path /mnt -prune -o -name "*libname-server-2.a*" -print
즉
... -path <excluded_path> -prune -o ...
/
제외 경로에 후행 을 추가 할 때마다 find
명령은 모든 /mnt/*
디렉토리 를 재귀 적으로 입력합니다.이 경우 /mnt/Backups/rsnapshot_backups/*
하위 디렉토리로 인해 검색 할 파일이 ~ 2.9TB가 추가됩니다! 후행을 추가하지 않으면 /
검색이 거의 즉시 완료됩니다 (초 이내).
... -not -path <exclude path> ...
마찬가지로 "솔루션 2"( )도 제외 된 디렉토리를 통해 재귀 적으로 검색하는 것으로 보입니다. 제외 된 일치 항목을 반환하지 않고 해당 검색 시간을 불필요하게 소비합니다.
그 안에서 검색 rsnapshot
백업 :
시간별 / 일별 / 주별 / 월별 rsnapshot
백업 중 하나에서 파일을 찾으려면 ) :
$ START="$(date +"%s")" && find 2>/dev/null /mnt/Backups/rsnapshot_backups/daily.0 -name '*04t8ugijrlkj.jpg'; END="$(date +"%s")"; TIME="$((END - START))"; printf 'find command took %s sec\n' "$TIME"
/mnt/Backups/rsnapshot_backups/daily.0/snapshot_root/mnt/Vancouver/temp/04t8ugijrlkj.jpg
find command took 312 sec ## 5.2 minutes: despite apparent rsnapshot size
## (~4 GB), it is in fact searching through ~2.9 TB)
중첩 된 디렉토리 제외 :
여기에서 /mnt/Vancouver/projects/ie/claws/data/*
검색 할 때 중첩 된 디렉토리를 제외하고 싶습니다 /mnt/Vancouver/projects/
.
$ time find . -iname '*test_file*'
./ie/claws/data/test_file
./ie/claws/test_file
0:01.97
$ time find . -path '*/data' -prune -o -iname '*test_file*' -print
./ie/claws/test_file
0:00.07
옆으로 :-print
명령 끝에 추가 하면 제외 된 디렉토리의 출력이 억제됩니다.
$ find / -path /mnt -prune -o -name "*libname-server-2.a*"
/mnt
/usr/lib/libname-server-2.a
$ find / -path /mnt -prune -o -name "*libname-server-2.a*" -print
/usr/lib/libname-server-2.a