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/
現在、ディレクトリは約2.9 TBを占め、約60Mのファイルとフォルダが含まれています。これらのコンテンツを単にトラバースするには時間がかかります。
## 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.9 TB追加されます!末尾に追加しないことにより/
、検索はほぼ即座に(数秒以内に)完了するはずです。
「ソリューション2」(... -not -path <exclude path> ...
)も同様に、除外されたディレクトリを再帰的に検索するように見えます。除外された一致は返されませんが、検索時間が不必要に消費されます。
それらの中を検索 rsnapshot
バックアップ:
毎時/毎日/毎週/毎月のrsnapshot
バックアップの1つでファイルを見つけるには:)
$ 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