2011-12-14 31 views
1

私は1つのフォルダを持っています。そのフォルダには32個のファイルと3個のディレクトリがあります。私は一番上の各ファイルにいくつかの行のテキストを追加したいと思います。どうやってやるの?ディレクトリのすべてのファイルに同じテキストを追加する

+1

'opendir'と' readdir'はあなたの再帰的なディレクトリ構造を読むのに役立ちます。 '-d'のようなファイルテストを使って、あなたが見たファイルがディレクトリかどうかを調べることができます。実際のファイルを見つけたら、一番上にテキストを追加する方法の1つは、ファイルを読み込んで閉じ、出力のために開いて、上のテキストを書き出し、残りのファイルを書き出すことです。 –

答えて

6

File::Findを使用してファイルを検索してください。ファイルの先頭に行を追加するには、Tie::Fileunshiftを使用します。

+0

さて、ありがとう:) –

+0

@ChankeyPathakよろしくお願いします。 – TLP

0

これは仕事ができる:

perl -pi -e 's/^/my text\n/' * */* 

それはあなたが何をしたいんことを確認するために、ディレクトリのコピーでこれを試してみてください。

+1

これは、すべてのファイルのすべての行に 'my text 'を追加します。むしろ、営業担当者は一番上に一度だけ追加したいと考えています。 'perl -pi -e '$。== 1とs/^/my text \ n /' 'は仕事をします。しかし、一度に1つのファイルで実行する必要があります。 – Gowtham

+0

@Gowtham訂正していただきありがとうございます。私は単一行のファイルをテストし、複数の行で発生する問題を逃しました。 –

+0

AKJとGowthamありがとうございました:) –

2

TLPは既に問題の解決方法をいくつか教えてくれました。しかし、それを行う方法は常に複数あります。 File :: FindとTie :: Fileの代わりに、私はいくつかの "モダンな"モジュールを使用します。これらの完全な例では、Path :: Class :: Ruleを反復的なインターフェースではなく反復的なインターフェースで使用します。

#!/usr/bin/env perl 
use strict; 
use warnings; 
use utf8; 
use open ':encoding(UTF-8)'; 
use open ':std'; 
use Path::Class; 
use Path::Class::Rule; 

my $rule = Path::Class::Rule->new->file; 
my $iter = $rule->iter(dir('test')); 

while (my $file = $iter->()) { 
    print $file->stringify, "\n"; 
    add_line_to_file($file, "Sid was here.\n"); 
} 

# 1: Path::Class::File Object 
# 2: The Line 
sub add_line_to_file { 
    my ($file, $line) = @_; 

    # Open File - return IO::File object 
    my $fh = $file->open('>>') or die "Cannot open $file: $!\n"; 
    # Seek to end 
    $fh->seek(0, 2); 
    # Add line 
    $fh->print($line); 
    $fh->close; 

    return; 
} 
関連する問題