
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個の正規表現/ワイルドカードマッチングを実行するのではなく、ハッシュテーブルを見つけることです。
答え2
私は何をしますか:
すべてのファイル名を一時ファイルに保存するスクリプトを作成します。
# maybe run this from cron or behind inotifywait
find dir -type f -print > /tmp/filelist
次に、入力ファイルを使用して必要に応じて照会を実行します。
fgrep -if hexids /tmp/filelist
-wif
代わりに使用を提案することもできますが、他のコメントを見ると、-if
あなたの質問に正確な情報を提供したかどうかはわかりません。man grep
より多くの情報を知りたいです。
答え3
@Kusalanandaのおかげで可能な解決策を考えました。
最初のステップは、各-a -b X
3組を単一の引数として扱うことですxargs
。次に、インラインスクリプトでこれらの単一引数トリプルを再分割し、sh
その中でユーティリティを呼び出します。
... |
awk '{ printf("%s%c", $0, 0) }' |
xargs -0 sh -c '[ "$#" -gt 0 ] && { printf %s\\n "$@" | xargs "$0" }' my_command