• ベストアンサー

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

RHEL6で、ファイルをコピーする際に以下の2通りのコマンドがあります。 --------------------- #x.txt ファイル内容の出力結果をy.txt に出力 cat x.txt > y.txt #x.txt ファイルをy.txt としてコピーする cp x.txt y.txt --------------------- 前者と後者では、効率的にはどちらも同じでしょうか。 cat(もしくはcp )を使う方がよいという場合、その理由を教えていただけますか。 お願いします。

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

  • ベストアンサー
  • k-841
  • ベストアンサー率27% (129/465)
回答No.3

実行時間は#1の方がおっしゃるように誤差の範囲と思いますので極論どちらでもいいとは思いますが、細かいことを言い出せばcpコマンドの方が無駄な処理は少ないです。 ざっくりと処理の流れを追うと、 cat x.txt > y.txt catコマンドがx.txtをO_RDONLYでopen シェルがy.txtをO_WRONLYでopen ーーループここから catコマンドがx.txtからread catコマンドが標準出力にwrite シェルが標準入力からread シェルがy.txtにwrite ーーループここまで catコマンドがx.txtをclose シェルがy.txtをclose cp x.txt y.txt cpコマンドがx.txtをO_RDONLYでopen cpコマンドがy.txtをO_WRONLYでopen ーーループここから cpコマンドがx.txtからread cpコマンドがy.txtにwrite ーーループここまで cpコマンドがx.txtをclose cpコマンドがy.txtをclose ループ内のシステムコールの数が違いますので、cpコマンドの方が効率はいいです。

MaiK_Birdy
質問者

お礼

とても丁寧な回答ありがとうございます。 ぜひ参考にします

その他の回答 (2)

  • 8ive22ty
  • ベストアンサー率52% (770/1479)
回答No.2

> ファイルをコピーする際に以下の2通りのコマンドがあります。 この考え方がおかしいと思います。 むしろ「単純なコピーならcatでもcpでも可能です」ということでしょう。 catとcpでは使用できるパラメータが異なりますので、使い分けるのが普通でしょう。 また、リダイレクト「 > 」での出力とcpとを比較しても意味があるとも思えません。

MaiK_Birdy
質問者

お礼

回答ありがとうございます。

  • entree
  • ベストアンサー率55% (405/735)
回答No.1

処理内容が違うので効率的に全く同じということはないでしょうが誤差範囲です。 理由は、処理のボトルネックがcpとcatの処理ではなく、ディスクI/Oだからです。 システムコールで言えばreadとwrite。cpでもcatでもこの部分は共通です。

MaiK_Birdy
質問者

お礼

ありがとうございます。参考になりました!

関連するQ&A

  • cat でファイルの拡張子を指定

    基本的なことで申し訳ないんですが、 UNIXのcat コマンドでファイルの中身を出力するときに、カレントディレクトリでないファイルを出力するには、パスも書きますよね。 cat パス/ファイル名 catでパスを指定して使うときに、 パスを繰り返し書かないで、 (その指定したディレクトリ直下だけでいいので)複数の特定の拡張子のファイルのみ出力するには、どうすればよいのですか? 例えば、 拡張子が、cとcsとtxtのファイルだけ出力して、その他のファイルは出力しない というようなときです。 既に書いたとおり、パスは繰り返して書かないので、 cat パス/*.c パス/*.cs パス/*.txt のようなものはナシということでお願いします。

  • ファイルから特定の行を出力したい

    あるファイルの特定の一行だけを取りだすunixの コマンドを教えて下さい。 具体的には cat a.txt 1gyoume 3gyoume 4gyoume 5gyoume 6gyoume 7gyoume 8gyoume といったファイルの末尾からX行目の内容を変数に入れたいのです。 a.txtが8行あると判断して8-X行目でファイルを分割、そのファイル をtailコマンドで末尾1行目だけ出力すると出来そうだと思ってい るのですがもっと簡単な方法はないでしょうか。

  • javaのファイルコピーについて教えてください。

    javaプログラミング初心者の者です。 javaでファイルをコピーし、コピーしたファイルを出力したいのですがどのようにしたよいかわかりません。 以下のように実行したら、ファイルをコピーし、コピーしたファイルを出力するといったものです。 実行例: java実行ファイル名 コピー元ファイル名 コピー後のファイル名 (java FileCopy copysarelu.txt copysareta.txt) ※copysarelu.txtはすでに存在し、copysareta.txtは任意の名前で作成します。 どなたかアドバイスまたは、参考URLなどをご紹介いただけますでしょうか?お願いします。

  • bashで変数を含んだファイル読み込み

    お世話になります。 外部読み込みファイルの中に変数やコマンドをセットして利用したいのですが、それはできないのでしょうか? ----test.txt messages-${testdate} `hostname`.log -------------------------- ----test.sh testdate=`date +%Y%m%d` for line in `cat test.txt` do echo $line done -------------------------- ----出力 messages-${testdate} `hostname`.log -------------------------- ----望む出力結果 messages-20150521 servername.log -------------------------- 方法がございましたら、ご教授お願い致します。

  • sedを使って複数ファイルの先頭行を表示

    以下の様なファイルがあります。 各ファイルの先頭行をとりだしたいのですが、headコマンドを使うと ファイル名と結果が分かれて表示されます。 sedで、-nオプションの行番号指定で表示することができるので、 sed -n '1p' *.txt のワイルドカード指定でやったのですが、 この場合だと複数ファイルとみてくれなくて、すべてのファイルを ひとつにしてその先頭を表示しているみたいです。 できれば、各ファイル毎に、ファイル名と結果を1行にして表示したい のですが、どうすればよいでしょうか。 参照ファイル cat 1.txt 12345 67890 cat 2.txt abcde fghij cat 3.txt 11111 22222 headコマンドで実行 $ head -n 1 *.txt ==> 1.txt <== 12345 ==> 2.txt <== abcde ==> 3.txt <== 11111 sedで実行 $ sed -n '1p' *.txt 12345

  • テキストファイルの内容を連結する簡易な方法

    2つのバイナリ形式のデータが出力されたテキストファイル 「C:\a.txt」「C:\b.txt」の中身を結合させて、 1つのファイル「C:\c.txt」にまとめようと思っています。 ファイルパスを指定し、CFile::OpenとCFile::Readで 一つずつファイル内容を読み出し、c.txtに書き出す方法だと少し手間がかかるので、 より簡易な方法で一つのファイルにまとめたいのですが、 何か効率的で良い方法があれば、教えていただけませんでしょうか? 例えば、Linuxでいうcatコマンドのような方法があれば理想的なのですが。。 よろしくお願い致します。 開発環境:VC++2005、MFC

  • 名前を変更してコピーを行うには

    Linuxのシェルスクリプトで、test1.txtというファイルを本日の日付を加えてコピーするにはどのような構文になるのでしょうか? (例:test1.txt → test1_20130531.txt) #!/bin/sh TODAY=`date +%Y%m%d` cp test1.txt test1_$TODAY でしょうか?

  • BATファイルによるfcコマンドでのファイル比較のエラー

    BATファイルによる、fcコマンドでのファイル比較を行いたいのですが、直接コマンドプロンプトで実行した場合では、正常に結果が指定ファイルに出力されるのに対して、BATファイルで同様のコマンドを実行しても, fcコマンドの比較結果が正常に出力されません。 原因を分かる方がいらっしゃいましたら、教えて頂けますでしょうか? 実行するfcコマンド内容 fc c:\a.txt c:\b.txt > c:\c.txt

  • PHP 削除やコピーが出来ない

    PHP 削除やコピーが出来ない $rcd = unlink("test.txt"); $rcd = `rm test.txt`; $rcd = exec('test.txt'); 上記のように、削除コマンドを実行しても削除されない。 コピーコマンドも、同じくで copy("hoge.txt", "hoge.dat"); fcopy("hoge.txt", "hoge.dat", TRUE); `cp hoge.txt hoge.dat` と、やってみたが削除対象ファイルなどに変化はありません。 ちなみに、削除対象ファイルのパーミッションは、644。 PHPファイルは、755. レンタルサーバーを、二つほど変えてみたが同じでした。 エラーを表示することも無かったので、何が悪いのかさっぱり分かりません。 何か、よい方法を教えてください。 よろしくお願いします。

    • ベストアンサー
    • PHP
  • xcopyで特定のファイルのみをコピーする方法

    xcopyもしくはcopyコマンドを使用し、ディレクトリ内の特定のファイル(複数)を コピーするにはどのようにしたら良いのでしょうか? 特定のファイルの数が多すぎるため、一行ずつコマンドを書くのは手間が掛るため、 何か良い方法があれば教えて頂きたいと思います。 excludeオプションを使用すれば特定のファイルを除外できるようですが、 反対の意味の特定のファイルのみをコピーしたいです。 例) c:\test内は以下のファイルがあります。 ・aaa.txt ・bbb.txt ・ccc.txt ・ddd.txt ・eee.txt これらのファイルの内、bbb.txtとddd.txtとeee.txtをコピーしたいです。