Linuxでfindコマンドを使用して前のコマンドで生成されたファイル名を検索する

Linuxでfindコマンドを使用して前のコマンドで生成されたファイル名を検索する

findこれらの命令を使用しようとしています。

cut -f 4 file.txt | awk 'NR>1' | find ./ -name 

awkコマンドの後の私の入力は次のようになります

foo.c
foo.txt
abc.txt

前のコマンドのファイル名を find コマンドに指定するにはどうすればよいですか?
したがって、基本的には、foo.c経路を探し求めてからfoo.txt経路を取得するなどの作業が行われる。

答え1

findここでは、各ファイルを見つけて目的のawk名前のファイルを選択する方が簡単です。たとえば、awkレコード区切り文字を NUL に設定することをサポートするとします。

find . -print0 | awk '
  ! names_loaded {if (NR>1) names[$4]; next}
  $NF in names' FS='\t' file.txt names_loaded=1 FS=/ RS='\0' -

答え2

各オプションに複数のオプションを個別に追加する必要があります-name。この試み:

IFS='
'
set -o noglob
find . -false $(awk -F '\t' -v OFS='\n' '
    NR>1 && $4 != "" { print "-o", "-name", $4}' file.txt)

awk1行に1つの引数を印刷するには、$(...)シェルで分割+グローブ演算子(引用符なし)を使用します。全体的な状況部分的に障害があります分ける改行に分割されるように部分的に調整されているので、 に引数として渡すだけですfind

file.txtサイズが大きいと失敗することがあります。また、名前はパターンとして扱われます。たとえば、を含む行がある場合は、名前で始まるファイルではなく、名前[f]ile*で始まるすべてのファイルを見つけます。file[f]ile*

ノーマルそして安全この契約には以下が使用されますxargs

something something | xargs -r0 find . -false

ただし、複数回xargs実行しfindて引数リストをan-oとa、-nameまたは-name実際のファイル名の間に分割することは可能です。 3の倍数である任意の数字を渡すことで-n 150これを防ぐことができ、その数字がパラメータサイズの制限内に収まるのに十分小さいことを願っています。

これを最初に配置すると、残りの-false処理が簡素化されます。これにより、-o-name

find非標準述語をサポートしていない場合は、それを誤って保証された他のものに置き換える-links 0ことができます。

答え3

zsh代わりに、ここで再帰グローブを使用してfind簡単に作成できます。

filenames=( ${(f)"$(<file.txt tail -n +2 | cut -f 4)"} )
print -rC1 -- **/(${(~j[|])filenames})(ND)

私たちが使うならf パラメータ拡張フラグcutlineeedで出力を分割しf~j[|]交互のglob演算子を使用して任意の数のサブディレクトリ、dotglob、およびnullglobの配列メンバーを連結します。|**/DN

一致が列に表示されますprintr1 C

名前がファイル名ではなくパターンとして解釈される場合は、次のように変更できます。

print -rC1 -- **/(${(j[|])~filenames})(ND)

globsubstは、oinフラグによって導入された~拡張だけでなく、完全な拡張にも適用されます。|j

答え4

find出力全体をに送信し、awkハッシュテーブルを使用して目的の名前を取得します。基本的には次のようになります。

Awk='
#.. Extract required names from list.
FS == " " { if (FNR > 1) Name[$4]; next; }
#.. List paths for given names.
$(NF) in Name { print; }
'
find . -type f -print0 | awk "${Awk}" FS=' ' "file.txt" RS=$'\0' FS='/' - | sort

ソートは名前で出力を収集します(ディレクトリツリーに重複がある可能性があります)。

Name[]配列のヒット数を計算し、ヒットのない名前をENDブロックにリストすることが改善される可能性があります。

find出力はnullで終了し(find-print0ではawkのRSようにNUL)、ファイルのみが参照されます(提供された名前と一致する予期しないディレクトリは他のソリューションで問題になります)。

関連情報