私はいくつかのdir
で検索をしたい、とこのdirecory内のファイルにawk
を行い、その後、それぞれの結果によって元のファイルを置き換えます。見つかったファイルのファイル名をパイプにプッシュすると見つかりますか?
find dir | xargs cat | awk ... | mv ... > filename
最後のコマンドでファイル名(findで見つかった各ファイルの)が必要です。どうやってやるの?
私はいくつかのdir
で検索をしたい、とこのdirecory内のファイルにawk
を行い、その後、それぞれの結果によって元のファイルを置き換えます。見つかったファイルのファイル名をパイプにプッシュすると見つかりますか?
find dir | xargs cat | awk ... | mv ... > filename
最後のコマンドでファイル名(findで見つかった各ファイルの)が必要です。どうやってやるの?
私は次のように、ループを使用します。
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
あなたはこのような何かを行うことができます(しかし、私はまったくお勧めしません)。
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行ずつ読み込んでループ内で処理します。
これにはどのような問題がありますか? –
スクリプトを書いて、ファイル名 'find dir -exec myscript {} \;' myscriptが 'name =" $ 1 "'のように始まり、cat、awkなどを実行します。 –
'xargs cat'はここでは無意味ですファイルを結合するため動作しません)。 'xargs awk'はより良いでしょう。(実際には' mv'を実行することを含め、 'awk'がそれぞれのファイルを独立して扱うようにします)。 –