10万以上のIDを含むファイルがあります。各IDは8から16の16進数で構成されています。
178540899f7b40a3
6c56068d
8c45235e9c
8440809982cc
6cb8fef5e5
7aefb0a014a448f
8c47b72e1f824b
ca4e88bec
...
インクルード項目を囲むディレクトリツリーで関連ファイルを見つける必要があります。2×10 9文書。
などのIDが与えられたら、次のように6c56068d219144dd
ファイルを見つけることができます。
find /dir -type f -name '* 6[cC]56068[dD]219144[dD][dD] *'
ただし、この作業を完了するには少なくとも2日かかります。
私が望むのは、できるだけfind
多くの-o -iname GLOB
三双子を呼び出すことですARG_MAX
。
私がしたいことは次のとおりです。
sed -e 's/.*/-o -iname "* & *"' ids.txt |
xargs find /dir -type f -name .
私の問題は、完全な3つの双子だけを受け入れるように強制することができないということですxargs
。
どうすればいいですか?
ベストアンサー1
これは間違ったアプローチです。名前がスペースで区切られた単語の1つで、これらのIDの1つを持つすべてのファイルを見つけることが目的である場合は、次のようにします。
find /dir -type f -print0 |
gawk '
!ids_processed {ids[$0]; next}
{
n = split(tolower($NF), words, " ")
for (i = 1; i <= n; i++)
if (words[i] in ids) {
print
break
}
}' ids.txt ids_processed=1 RS='\0' FS=/ -
その後、ファイルリストを一度だけ処理して100,000個のIDを見つけることは、最大100,000個の正規表現/ワイルドカードマッチングを実行するのではなく、ハッシュテーブルを見つけることです。