• ベストアンサー

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

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

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

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

  • ベストアンサー
  • m_mik
  • ベストアンサー率26% (31/117)
回答No.6

#3です。 試していなかったので、ちょっと確認してみました。 ファイルを開くところでディレクトリを指定していなかったのでファイルが開けずに書き込まれない状態になっていたようです。 ですので、ディレクトリの指定を追加してください。 $dir = "A"; open(OUT , "> ex.txt"); opendir(DIR , $dir); while ($file = readdir(DIR)) { open(IN , "$dir/$file"); print OUT while (<IN>); close(IN); } closedir(DIR); close(OUT);

kotikaze6
質問者

お礼

ありがとうございました。これだけ短くてわかり易いコードは 理想的でしかもやりたいことが完全にできました。 ここから更に機能を増やしていきたいと考えています。 またもし質問することがあれば宜しくお願いします。

その他の回答 (5)

  • x415f484f
  • ベストアンサー率71% (57/80)
回答No.5

ANo.4 の補足部分から引用 > 今後のためにも過程を大事にしたいので・・ > 質問の意味もわかりにくかったと思うのでもう一度整理して書きます。 なんとなくはわかるんですが、確認させてください。 以降の引用は QNo.3855079 からの引用 > Aフォルダにaa,bb,ccというテキストファイル 要するにディレクトリ構成はこうなっているのでしょうか? # ディレクトリ B は余計かもしれないですけど。 ./ |--A/ | |-- aa | |-- bb | |-- cc | |--B/ | |--dd (以下略) と、なっているものを A/aa ... B/dd... と全て見つけたいのですか? これを「工程 1」として 列挙したファイル(aa 、bb 、cc や B/dd)を読み込んで、カレントディレクトリの ex.txt に列挙したファイルの中身を追記して保存したいということでしょうか? これを「工程 2」として 「工程 1」を実現する場合は File::Find というものがあります。 使う方法は下記の URL をご覧になってください。 http://katsubemakito.net/cgiperl/2006/10/perl2.html # ただし各引数の意味がわかるまでは使わないほうがよろしいと思います。 カレントディレクトリまたは、任意のディレクトリの下層を含めて繰り返して ファイルの列挙するようなことを「"再帰的"な検索」と言います。 # 余計なことで申し訳ないですが、気になったことを記述させて頂きます。 # 細かいことはスルーすべきなのでしょうけど。 > File::Copy と、モジュールを使おうとなさっておられたのに…… > while文でやってみましたが、これも引数の指定がわからない状態 これは while 文のひき数がわからないということだったのでしょうか? ひき数についての調査はご自分でどこまでなされたのでしょうか? 勉強したいという意志をお持ちなら、焦らずにひとつひとつの持つ意味を 理解してプログラミングをされるほうがよろしいのではないでしょうか? ただコードを貼るのではなくに、ご自身が意図する動作をコメントとして 書いて頂けるとわかりやすくなります。 # 回答者の方々とのやりとりを拝見していると、努力されているのは # わかりますけど。 また、ご質問のスレッドごとにお使いの環境などを書いていただけると 助かります。 OS や Perl のバージョンによっては使えないモジュールがあるからです。 たとえば、こんな感じで <Perl> perl 5.8.8 等 <OS> linux(Fedora8) や WindowsXP 等 このような情報は、質問する方と回答する方の双方にメリットがあること だと思いますので、そうなさったらいかがでしょうか? # くどいことを申し上げたので、どうお感じになられるかは判りませんが、 # 別に意地悪で言っているのではないのです。がんばってください。

kotikaze6
質問者

補足

丁寧にありがとうございます。確認事項についてはその通りです。 工程1に関しては、何とかできました。問題は工程2です。 今日も一日かけましたが、できず・・ パールのバージョンはtelnetを使えないので見れませんでした。 Aフォルダを開く  Aフォルダ内のファイルの一覧を取得する Aフォルダ内のファイルの内容を表示 書き込み用exファイルを開く KS ファイルの内容が蓄積された配列をexファイルにプリントする print KS @line; わかりにくいかもしれません。。 自分でも思いますがこういった手順を本などを見ながら今も模索中です。 再帰的な検索がこうも難しいとは…   

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

これ, 悩むくらいなら system 使った方がはやいんじゃない?

kotikaze6
質問者

補足

今後のためにも過程を大事にしたいので・・ 質問の意味もわかりにくかったと思うのでもう一度整理して書きます。 ◎条件 試作フォルダ内にsisaku.bat sisaku.pl ex.txt Aフォルダがあって Aフォルダ内に aa.txt,bb.txt,cc.txt というテキストファイルが3つあります。 テキストファイルの内容は何でもいいのですが、例えばaa.txt には aaaaaa bb.txt には bbbbbbb tttttt ggggggg などと書き込まれている。 ★やりたいこと ex.txt ファイルに Aフォルダ内にある3つのファイル全ての内容を書き込みたい。     ex.txt aaaaaa tttttt bbbbbb gggggg ← のように 今のところ、ファイルを1個ずつ指定すれば書き込めるが、フォルダ内のファイルが例えば1000個に増えたとき、いちいち指定するのは 実用性がないので、何か方法がないかと考えて相談させてもらった次第です。 この説明で伝わったでしょうか?。。

  • m_mik
  • ベストアンサー率26% (31/117)
回答No.3

opendir()、readdir() でディレクトリの内容を取得して、ファイルの内容を読み出して書き込んでいくというのでは駄目でしょうか? open(OUT , "> ex.txt"); opendir(DIR , "A"); while ($file = readdir(DIR)) { open(IN , $file); print OUT while (<IN>); close(IN); } closedir(DIR); close(OUT); 実行していませんがこれで上手くいくでしょうか?インデントは調整してください。

kotikaze6
質問者

補足

ソースコードありがとうございます。 実行してみましたが、うまくいきませんでした。 my $dirname = '.'; opendir(DIR, $dirname) or die "$dirname: $!"; while ( my $dir = readdir(DIR)) { next unless (-f $dir); next unless ($dir =~ /.\txt$/); print $dir, "\n"; open(FILE, $dir) or die "$dir: $!"; while (my @line = <FILE>) { print @line; } close(FILE); } closedir(DIR); ↑こういうのも試しましたが、最後のファイルの内容しか書き込めません。フォルダ内のファイルの内容を表示させることは何とかできても、 表示した内容を全部書き込めないのが現状です。

  • 1582
  • ベストアンサー率10% (293/2664)
回答No.2

 いっぺんにやらず一つずつコピペしていくとかじゃだめかな

kotikaze6
質問者

補足

ファイルが100入っててもいいようにしたいので・・

noname#65902
noname#65902
回答No.1

質問が意味不明です。

kotikaze6
質問者

補足

同フォルダ内のAフォルダに ここですね。間違えました。

関連するQ&A

  • 多数のサブディレクトリ内のファイルを一括コピーする

    コマンドプロンプトについて初心者ですがよろしくお願いします。 多数のサブディレクトリとフォルダ名もバラバに異なる中から特定のファイル(.txt)のみを全てを一括しコピーしたいのですがバッチファイルを使用した方法を教えてください。 (コピー元 C:)             (コピー先F:) \AA ∟\aa ∟aa.txt                aa.txt \BB ∟\bb ∟bb.txt        ⇒       bb.txt \CC ∟\cc   ∟ cc.txt               cc.txt

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

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

    • ベストアンサー
    • Perl
  • 上書きコピーについて

    Windows Vista Ultimateを使用しています。 同名のフォルダごとコピーする場合について質問なんですが、 たとえば新フォルダ「abc」を旧フォルダ「abc」に上書きする場合、  新フォルダの中身:aa.txtとbb.txt  旧フォルダの中身:aa.txtとbb.txtとcc.txt この場合、aa.txtとbb.txtが上書きコピーされますが、 この時、旧フォルダに元々あったcc.txtが残ります。 フォルダごとコピーした時に旧フォルダに元々あったcc.txtを残さない設定にできますか? コピー後にaa,txtとbb.txtだけが残るようにしたいのです。

  • コマンドプロンプトのバッチファイルについて

    ディレクトリ1に以下のようなファイルがあります。  "file01_05_aa.jpg"  "file01_05_bb.jpg"  "file01_05_cc.jpg"  "file21_04_aa.jpg"  "file21_04_bb.jpg"  "file21_04_cc.jpg"  "file31_03_aa.jpg"  "file31_03_bb.jpg"  "file31_03_cc.jpg" これらのファイル形式は (file)(XX)_(XX)_(XX).jpg これらの中からこの正規表現でヒットするファイルのみ指定した別ディレクトリにコピーしたいです。 file\d\d_(05|03)_(aa|cc)\.jpg Windowsのコマンドプロンプトで実現可能でしょうか。可能であればコマンド列を教えてください。 (cygwinでも良いです。) よろしくお願いいたします。

  • フォルダ内のファイルをテキストファイル化

    タイトルに何と書けばいいのかわからなくて 説明がちょっとややこしいのですが フォルダ内のファイル(aa.mpg、bb.mpg・・・)を同名でテキストファイル(aa.txt、bb.text・・)に変換 もしくはすでにあるデータファイルを同じ数だけテキストファイルにする(データファイルが50個あったらテキストファイルが50個出来る)ソフトはないものでしょうか? フォルダ内のファイルを1つのテキストファイルの中にリスト化するというのはよく見かけるのですが 上記の様なものは探したのですが見つからなかったので・・ ご存じの方がいらっしゃったらよろしくお願いします

  • ファイルコピー

    「ルートディレクトリ内の全てのファイルの中でファイル名に"1111"及び"2222"と言う文字列が含まれるファイルを./333/444ディレクトリに同じファイル名が無ければコピーする」 というスクリプト(下記qqq.php)を作りましたが、 「ルートディレクトリ内の全てのファイルの中でファイル名に"1111"及び"2222"と言う文字列が含まれるファイルの中で最もファイル更新時刻が新しいものだけを./333/444ディレクトリに同じファイル名が無ければコピーする」 と変えたいのですがどうも上手くいきません。 この『・・・文字列が含まれるファイルの中で最もファイル更新時刻が新しいものだけを・・・』の部分につきまして、ご教授ください。 スクリプトを記載していただけるととても助かります。 どうか宜しくお願いいたします。 ********************* qqq.php <?PHP if ($dir = opendir("./")) { while (($file = readdir($dir)) !== false) { if(preg_match("/1111/",$file)) { if(preg_match("/2222/",$file)) { $to="./333/444/".$file; if(!file_exists($to)) copy("./".$file,$to); } } } closedir($dir); } ?>

    • ベストアンサー
    • PHP
  • windowsバッチファイルで実行フォルダ移動

    お世話になります。王次郎です。 windows7 バッチファイルで、引数で渡されたファイルまたはフォルダの ディレクトリにカレントディレクトリを変更したいです。 方法を教えてください。 ・ 引数(%1%)が無いときは、カレントディレクトリはバッチファイルのあるディレクトリのままにします ・ 引数(%1%)がフォルダのときは、カレントディレクトリをその引数のフォルダにします CD %1% ・ 引数(%1%)がファイルのときは、そのファイルの置かれているディレクトリを抽出して その抽出したディレクトリに移動します よろしくお願いします。

  • バッチでのファイルのコピー

    ファイルのコピーをしたいのですが、 C:\aaa\bbb\???\test.txt と、「bbb」のディレクトリまでは分かるのですが、 必ず「???(任意)」のディレクトリが入ります。 そのディレクトリの下には必ず対象となるtest.txtと いうファイルが存在します。 「???」がなければ、 copy c:\ddd c:\aaa\bbb\test.txt と出来るのですが、「???」のために取ることが出来ません。 どなたか、ご存知の方がいましたら教えて下さい。 宜しくお願い致します。

  • ネットワークの指定は?

    サーバとクライアントと言う関係で、phpでcopy関数を 使おうとしています。 ファイル指定で、サーバのIPとクライアントのIPを 指定したいのですが、上手くいきません。 どなたかのアドバイスが頂ければと思います。 ちなみに、したいことの記述としては、 copy("\\192.168.0.1\tmp\aa.txt", "\\192.168.0.2\tmp\bb.txt");  サーバのaa.txt をクライアントにbb.txtとしてコピー。 環境  サーバ:Windows2K     :WindowsApache     :WindowsPHP  クライアント:Windows2K

    • 締切済み
    • PHP
  • 複数フォルダ内のファイルを一括コピーする方法

    環境はWindows7です。 下記構成のファイルを一括で特定のフォルダにコピーする方法を探しています。 C\aaa\111.txt C\aaa\112.txt ・・・ C\bbb\121.txt C\ccc\33.txt ------------------ ⇒C\ddd 配下へコピーしたい 方法(1):F3で「.txt」で検索してヒットしたものを一括でコピーする。 方法(2):.batファイルを使ってやる。 方法(2)について、下記のように書いてみました。 REM 複数フォルダーの不特定多数のファイルを特定フォルダーにコピーする pause cd %~dp0 dir /b No* >list.txt for /F %%i in ( list.txt ) do copy /y %%i\*.txt 特定フォルダー pause カレントディレクトリにある複数フォルダ名をlist.txtに出力し、 それをまた読み込んでforを使って特定フォルダーにコピーする。 これだと同名のファイルがあった場合でも問答無用でどんどん上書きされてしまいます。 「コピーするが両方のファイルを保持する」状態にしたいんですが、 何か方法はないでしょうか・・・?

専門家に質問してみよう