• ベストアンサー

Perlで フォルダ内の全てのファイルを別のフォルダにコピーするには

お世話になります。 多分ご存知の方には簡単な話だと思いますが教えていただけませんか。 Aフォルダにあるhoge.txtをBフォルダにコピーしたければ use File::Copy; copy "./A/hoge.txt", "./B/hoge.txt" or die $!; で出来るのはわかっているのですが、Aフォルダにある全てのファイルをBフォルダにコピーするというのはどのようなコードを書いたらよいのでしょう。 ちなみにAフォルダには100以上ファイルがあります。ファイルは全部テキストファイルです。

  • Perl
  • 回答数5
  • ありがとう数2

質問者が選んだベストアンサー

  • ベストアンサー
  • agharta
  • ベストアンサー率52% (54/103)
回答No.1

$src_dir = "./a"; $dst_dir = "./b"; opendir(DIR, "$src_dir"); my @Files = grep { -f "$src_dir/$_" && /\.txt/ } readdir(DIR); closedir DIR; foreach my $file (@Files) { copy ... } こんな感じですかね

souta_n
質問者

補足

すみません。ほとんど素人なんで。。。その『copy ..』のところも明記してもらうとすごく助かるんですけど、お願いできませんでしょうか

その他の回答 (4)

回答No.5

ヒントでは無理なようなので、具体的に・・・。 例では、./log/A/○○.txt のようなパスの場合の記述です。 my $dir = '/log'; # 対象ディレクトリ名(相対パスでもOKです) opendir DH, $dir or die "$dir:$!"; while (my $file = readdir DH) { use File::Copy; copy "./A/$file, "./B/$file" or die $!; } closedir DH; 以上。未チェックですが。

souta_n
質問者

お礼

結局いろいろ自身でも勉強して、#1の方の回答を理解できました。 おかげさまで何とか目的を果たせました。 他にも沢山のご指導をいただけて感謝しています。 何か回答を追う毎に話が難しくなってきたようです。私の理解の範疇を超えてきました。早く皆様の域に達せられるように努力します。

  • tatsu99
  • ベストアンサー率52% (391/751)
回答No.4

ファイルの再帰的なコピーをする場合、unixで提供されている cp -R(又は-r)コマンドが使用できます。 これをsystem関数を使用して、呼び出してはいかがでしょうか。

  • Tacosan
  • ベストアンサー率23% (3656/15482)
回答No.3

や, 多分 #2 は use File::Copy::Recursive; して rcopy_glob 使えってことなんだろうけど... rcopy_glob("./A/*.txt", "./B"); みたいな感じで使えるんじゃないかなぁと思う. ちなみにそこで参照してる URL の内容がチンプンカンプンなのはしょうがないね. 誤訳が多すぎ. これなら英語を読んだ方がまだ意味がわかる... と書きたいところだけど英語も微妙にあやしい気がする.

noname#208124
noname#208124
回答No.2

File::Copy::Recursive でいいやん

souta_n
質問者

補足

foreach my $file (@Files) { File::Copy::Recursive; } ですか? エラーは出ませんがファイルもコピーされません。 検索してこんなページ見つけたけど・・・あぁチンプンカンプン http://perldoc.jp/docs/modules/File-Copy-Recursive-0.06/Recursive.pod

関連するQ&A

  • フォルダ内のファイルのコピーについて

    同フォルダ内にAフォルダにaa,bb,ccというテキストファイルがあります。これをex.txtファイルにaa,bb,ccファイルの内容をコピーしたいのですが、うまくいきません。 最初はuse File::Copyでやろうとしましたが、これはディレクトリの中のファイルの指定がわからず、断念。 次にwhile文でやってみましたが、これも引数の指定がわからない状態です。 もしよければお知恵を貸してください。

    • ベストアンサー
    • Perl
  • ディスク残量が無くなってしまった場合のファイル操作

    都合上、検証ができません。 最悪、『サーバーのディスク残量が無い時』に 以下3パターンの処理実行時の挙動(ちゃんとエラーが帰ってきてdieに行くのか?など)はどうなるかご存知でしたら宜しくお願い致します。  # File::Copyモジュールによるコピー時 copy ("foo.txt", "bar.txt") or die "Copy failed: $!";  # File::Copyモジュールによるムーブ時 move ("foo.txt", "bar.txt") or die "Move failed: $!";  # 書き込み時 open(OUT,"> file.txt")or die "Can't open file.txt: $!"; print OUT "DEF"; close(OUT); renameは問題ないと思っています。。

  • 複数のフォルダに複数のファイルを一括コピー

    複数のフォルダに対し、同時に複数のファイルを一括コピーしたいのですが、なにかよいソフトなどご存じないでしょうか? 例) C:\ファイルA.txt C:\ファイルB.txt 以上のファイルを D:\テキストフォルダ(1) D:\テキストフォルダ(2) D:\テキストフォルダ(3)   ・    ・ へそれぞれ一括でコピーしたいのです。 Googleやベクターで探したのですが、探し方が悪いのか見つかりませんでした。

  • ファイルのコピーについて

    $file = './hoge/index.html'; $file_to = './hoge/index2.html'; //コピー成功 ↓ $file_to = './hoge/php/index.html'; //コピー失敗 if(copy($file, $file_to)){ echo "コピーしました。:"; } else{ echo "コピーに失敗しました。:"; } 同じ階層にコピーファイル作成は成功するのですが、 ディレクトリを下げた階層にコピーファイルを作成しようとすると失敗してしまいます。 パーミッションの設定がわるいのか権限がないのか、よくわかりません。 エラー内容 Warning: copy() [function.copy]: SAFE MODE Restriction in effect. The script whose uid is 10124 is not allowed to access 教えて下さい。お願いします。

    • 締切済み
    • PHP
  • 別のフォルダにコピー

    Visual Basic Express 2012 テキストボックスにファイルをD&Dして、絶対パスを取得して 名前を変更してコピーしています。 D:\test\aaa.txt → D:\test\aaa_abc.txt "cmd /c copy " & filen1 & ".txt " & filen1 & "_abc.txt" filen1は拡張子なしの絶対パスになっています。 末尾に文字を追加してコピーしているのですが、パスの途中に 文字を追加したいです。 D:\test\aaa.txt → D:\test\old\aaa_abc.txt 上記のように別のフォルダにコピーするにはどうしたら良いでしょうか?

  • ファイルコピー

    $copyF = 'hoge/index.html'; $copyF2 = 'hoge/copy/index.html'; copy($copyF , $copyF2); コピー元ディレクトリより下のディレクトリにファイルコピーを したいのですが、上のコードだとうまくいきません。 ディレクトリを超えてのコピーは無理ですか?

    • 締切済み
    • PHP
  • ファイル名を正規表現にかける際の文字コードについて

    Windows XP, ActivePerl5.8.8 です。 windows 上にあるファイルの名前に沿ってフォルダに振り分けしたく、 以下のようなコードを書きましたが、 ファイル名に日本語の「ソ」などがある場合に 処理がおかしくなります。 文字コードの問題だと思いますが、どうすれば解決できるでしょうか。 ++++ここからソース++++++ #!c:/perl/bin/perl.exe use 5.008; use strict; use warnings; use File::Basename; use File::Copy; use File::Path; my $newdir = "C:/tmp"; for my $filename ( @ARGV ){ main($filename); print "complete.\n"; } sub main{ my ($filename) = @_; my($basename, $basedir) = fileparse($filename); my($name1, $name2, $ext) = $basename =~ /^(.*) - (.*)(\.[a-zA-Z0-9]+)$/; mkdir "${newdir}/${name1}"; File::Copy::copy( "${filename}", "${newdir}/${name1}/${basename}" ) or die "${filename} : Cannot copy"; } 1;

    • ベストアンサー
    • Perl
  • perl ファイルが開かない

    perl でファイルを開きたいのですが、なぜか開けません。何がいけないのでしょうか?エラーは、 Name "main::file" used only once: possible typo とでます。エラーを見るかぎり、コードに間違いはなく、apacheかOSに何か原因があるのではないかとおもうのですが、悩んでいます。OSはubuntuです。 #!/usr/bin/perl -w open (IN, "<test.txt") or die ("Could not open $file: $!"); while(<IN>) { print "$_"; } close (IN);

  • Perlでのファイル入出力、処理方法

    メモ帳で以下のようなプログラムを書きました。(file_1.plで保存しました) #!/usr/bin/perl $file="data.csv"; $cityfile="name.txt"; $outfile="data_out.csv"; open (IN, $file) or die "$!"; open (FILE, $file) or die "$!"; open (OUT, ">$outfile") or die "$!"; @city = <FILE>; ・ ・ ・ これをCygwinコマンド上で、 perl file_1.pl と入力し、Enterを押すと「No such file or directory at file_1.pl line 9.」と表示されます。 line9はopen (FILE, $file) or die "$!";という文です。 どこが間違えで、どのように修正すればよいのでしょうか。 よろしくお願いします。

  • perlで文書を読み込み検索置換したい

    MAC OS Xを使用しています。 検索置換のプログラムをperで作成し、Applescript上で呼び出したいのです。 実際はファイルメーカーのスクリプトの中でApplescriptを記述してその中で呼び出したいのです。 do shell script "perl ~.pl"という感じで使えるのではないかと 下記のようなサンプルスクリプトを見つけたのですが 内容の更新の仕方がよく分かりません。 perlについては全くの初心者でいろいろ調べたのですがよく理解できませんでした。 検索置換したいのですが、どういうふうに書けばいいのでしょうか。 (2)の部分を教えて下さい。宜しくお願いします。 use strict; use warnings; use File::Copy 'move'; # (1) ファイルの内容を読み込む my $file = 'F:\共有\PERL\test.txt'; open my $fh, '<', $file or die qq/Can't open file "$file": $!/; my $content = do {local $/; <$fh>}; close $fh; # (2) 内容の更新 ▼をリターンに置き換えたいのです。 $line =~s/▼/\n/; # (3) 一時ファイルへの書き出し my $temp_file = "$file.$$." . int(rand 10000); open my $temp_fh, '>', $temp_file or die qq/Can't open file "$file": $!/; print $temp_fh $content; close $temp_fh or die qq/Can't open file "$file": $!/; # (4) 一時ファイル名を元のファイル名に変更 move $temp_file, $file or die qq/Can't move "$temp_file" to "$file": $!/;

専門家に質問してみよう