2012-01-05 42 views
0

私がやろうとしていることを達成するのに役立つコマンドが必要です。現時点では、私は特定のディレクトリ内のすべての ".html"ファイルを探していて、その中に文字列 "jacketprice"が含まれているものを見ています。bashを使用すると、ディレクトリ内のすべてのファイルを検索する方法(再帰的に)

これを行う方法はありますか?また、2番目のコマンドでは、 "jacketprice"のすべてのインスタンスを1つのコマンドまたはスクリプトで "coatprice"に置き換える方法が必要です。これが実現可能なら、私に知らせてください。お持ちでない場合は

grep -r --include="*.html" jacketprice /my/dir 

が代わりに(bashののglobstar機能をオンに:2つ目の質問、あなたのファイルを検索する

find . -name "*.html" -exec sed -i "s/jacketprice/coatprice/g" {} \; 

答えて

3
find . -name "*.html" -exec grep -l jacketprice {} \; 

for i in `find . -name "*.html"` 
do 
    sed -i "s/jacketprice/coatprice/g" $i 
done 
+1

'sed -i'はこれを一度に行います。 –

+0

@larsmans - 固定、ありがとう:) – KevinDTimm

+0

待っていて、前のスクリプトの2行目を修正できますか?とにかく学習目的で分析することを望んでいました。 :D –

3

)、**/を使用してディレクトリとサブディレクトリを一致させることができます。

は、非再帰、検索:

perl -nwe 'print "Found $_ in file $ARGV\n" if /jacketprice/' *.html 

はマッチがある行を出力しますあなたが再帰的かどうか、これをしたいかどうか、perlは良い選択肢であるに応じて、

$ shopt -s globstar 
$ cd /my/dir 
$ grep jacketprice **/*.html 
$ sed -i 's/jacketprice/coatprice/g' **/*.html 
+0

この提案をありがとう! :) –

3

使用再帰のgrepについては感謝

1

ファイル名が続きます。少し冗長にすることができます。

は非再帰的、交換してください:

perl -pi.bak -we 's/jacketprice/coatprice/g' *.html 

は上のタック.bak拡張子を持つ元格納します。

は、再帰検索:

perl -MFile::Find -nwE ' 
    BEGIN { find(sub { /\.html$/i && push @ARGV, $File::Find::name }, '/dir'); }; 
    say $ARGV if /jacketprice/' 

それは各試合のファイル名を表示します。やや少ない冗長であるかもしれない:

perl -MFile::Find -nwE ' 
    BEGIN { find(sub { /\.html$/i && push @ARGV, $File::Find::name }, '/dir'); }; 
    $found{$ARGV}++ if /jacketprice/; END { say for keys %found }' 

再帰、交換してください:

perl -MFile::Find -pi.bak -we ' 
    BEGIN { find(sub { /\.html$/i && push @ARGV, $File::Find::name }, '/dir'); }; 
    s/jacketprice/coatprice/g' 

注:すべての再帰的なバージョンでは/dirは、あなたが検索したい最下位レベルのディレクトリです。また、perlのバージョンが5.10未満の場合、sayprintに置き換えられ、その後に改行が続きます。 print "$_\n" for keys %found

関連する問題