2016-05-25 1 views
1

私はいくつかのdirで検索をしたい、とこのdirecory内のファイルにawkを行い、その後、それぞれの結果によって元のファイルを置き換えます。見つかったファイルのファイル名をパイプにプッシュすると見つかりますか?

find dir | xargs cat | awk ... | mv ... > filename 

最後のコマンドでファイル名(findで見つかった各ファイルの)が必要です。どうやってやるの?

+0

これにはどのような問題がありますか? –

+1

スクリプトを書いて、ファイル名 'find dir -exec myscript {} \;' myscriptが 'name =" $ 1 "'のように始まり、cat、awkなどを実行します。 –

+0

'xargs cat'はここでは無意味ですファイルを結合するため動作しません)。 'xargs awk'はより良いでしょう。(実際には' mv'を実行することを含め、 'awk'がそれぞれのファイルを独立して扱うようにします)。 –

答えて

0

私は次のように、ループを使用します。

for filename in `find . -name "*test_file*" -print0 | xargs -0` 
do 
    # some processing, then 
    echo "what you like" > "$filename" 
done 

EDIT:コメントで述べたように、-print0 | xargs -0の利点があるためforループにより失われます。また、空白を含むファイル名は正しく処理されません。確かに、少なくとも

whileループは(それは問題ではありませんでしたが、それを知ってもいい)どちらも珍しいのファイル名を扱えないだろうが、標準のホワイトスペースを含むファイル名、それがうまく機能して、:

find . -name "*test*file*" -print > files_list 

while IFS= read -r filename 
do 
    # some process 
    echo "what you like" > "$filename" 
done < files_list 
+0

私は知っていますが、 'find dir'でスターリングすることでこれを行うことができるかどうか疑問に思っていました。 – ericj

+0

質問にこの精度を追加することはできますか?ファイル名をどこかに格納せずに、私はいくつかのコマンドの後にそれらを戻す方法を知らない。 – zezollo

+0

'find dir | read filename 'は非常によく似た動作をしますが、find dirで始まりますが、zezollosの答えはケースをカバーします。 "find dir'で始めることに熱心な理由は誰も理解していません。 –

0

あなたこのような何かを行うことができます(しかし、私はまったくお勧めしません)。

find dir -print0 | 
    xargs -0 -n 2 awk -v OFS='\0' '<process the input and write to temporary file> 
     END {print "temporaryfile", FILENAME}' | 
    xargs -0 -n 2 mv 

これは、直接2時(catが一斉に引数として何百もの(おそらくより)ファイルを取得し、awkすべてその内容を吐くだろう、あなたのオリジナルの問題を回避するawkにファイルを渡します。標準入力から一度に読み込まれ、個々の内容とファイル名が完全に失われます)。

それは、その後awkが一時ファイルに処理された出力を書き込み、その後、一時的なファイル名とxargsはそれらをピックアップ(再び2時)と一時ファイル/元のファイルのペアにmvを実行し、元のファイル名を出力しています名前。

私が最初に言ったように、これはこれを行うにはひどい方法です。

あなたは、あなただけのawk-i(インプレース)引数を使用して(私は信じて)使用することができGNU awk(バージョン4.1.0以降)の新しい十分なバージョンをお持ちの場合:

find dir | xargs awk -i '......' 

それがなければ、Bash FAQ 001の形式のwhileループを使用して、findの出力を1行ずつ読み込んでループ内で処理します。

関連する問題