1

基本的に、.csv ファイルを見つけるためにスキャンする必要があるディレクトリとサブディレクトリがあります。そこから、「foo」を含むすべての行を、見つかった csv から新しいファイル (元のファイルと同じディレクトリ内) にコピーしますが、見つかったファイルを反映した名前を付けます。

これまでのところ、

find -type f -name "*.csv" | xargs egrep -i "foo" > foo.csv

これにより、すべてが含まれる 1 つのバックアップ ファイル (foo.csv) が作成され、ファイルが見つかった場所はデータの一部になります。どちらも私は望んでいません。

私が欲しいもの:

たとえば、私が持っている場合:

csv1.csv
csv2.csv

どちらにも「foo」を含む行があります。これらの行を次の場所にコピーしたいと思います。

csv1_foo.csv
csv2_foo.csv

元のファイルの「foo」を含む行全体を除いて、バックアップに余分なものは何も入力しません。つまり、バックアップ データに元のファイル名は必要ありません。これは、現在のコードが行っていることです。

また、私は egrep を使用していることに注意する必要があると思いますが、私の例では正規表現を使用していません。特定のシナリオに適用するときに検索で正規表現を使用するため、新しいファイルに名前を付けるときにこれを考慮する必要があると思われます。それが難しすぎると思われる場合は、正規表現を考慮しない回答で問題ありません。

お早めにどうぞ!

4

3 に答える 3

1

とにかく役立つ場合はこれを試してください。

find -type f -name "*.csv" | xargs -I {} sh -c 'filen=`echo {} | sed 's/.csv//' | sed "s/.\///"` && egrep -i "foo" {} > ${filen}_foo.log'
于 2013-04-04T14:39:30.843 に答える
1

これを試すことができます:

$ find . -type f -exec grep -H foo '{}' \; | perl -ne '`echo $2 >> $1_foo` if /(.*):(.*)/'

それは使用しています:

  • findファイルを反復する
  • grepfile path:lineタプルを出力する ( -Hswitch )
  • perlこれらの行を出力ファイルにエコーします (バックスラッシュを使用しますが、よりきれいにすることもできます)。
于 2013-04-04T13:15:47.067 に答える