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)
awk
1行に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
パラメータ拡張フラグcut
lineeedで出力を分割しf
、~j[|]
交互のglob演算子を使用して任意の数のサブディレクトリ、dotglob、およびnullglobの配列メンバーを連結します。|
**/
D
N
一致が列に表示されますprint
。r
1
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
)、ファイルのみが参照されます(提供された名前と一致する予期しないディレクトリは他のソリューションで問題になります)。