キャリテク!マガジン
- TOP
- キャリテク!マガジン
- Linuxでファイルを作ってコピーしてみた(touch/cp)
Linuxでファイルを作ってコピーしてみた(touch/cp)
こんにちは、吉政創成 アシスタントの菱沼です。
前回はファイルとは何かを学習した後、Linuxサーバ内にあるファイルを表示させるために使うlsコマンドとそのオプションについてまとめました。
今回は、ファイルの作成とコピーについて学んでいきます。
では、今回も「さわって学ぶLinux入門テキスト/赤星リナ氏著(マイナビ出版)」を片手に勉強していきます。どうぞ超初心者の方、お付き合いいただければ幸いです。
【touch】でファイルを作ってみる
さて、ディレクトリを作成するときには[mkdir]を使いました。 ファイルを作るときのコマンドはどんなものかというと…。
P68 引用:
●ファイルの作成[touch]
ファイル操作を行う前に練習用の空のファイルを作っておきましょう。
空のファイルはさまざまなつくり方がありますが、タイムスタンプを変更する[touch]コマンドを使ってみましょう。
$touch test1 :test1ファイルがなければtest1ファイルを作成する
[touch]を使うそうです。早速作ってみました。
復習の意味を込めて、カレントディレクトリの確認[pwd]や、ディレクトリ/ファイルの存在確認[ls]、ディレクトリの移動[cd]もやってみました。
以前作成したディレクトリ[1_haru]内にはディレクトリもファイルもない状態です。今回はその中に[ohanami]というファイルを作成してみました。[ls]で確認するとしっかりできていることがわかります。
タイムスタンプも変更できる
touchコマンドは空のファイルを作成するだけでなく、時刻を変更するときにも使うそうです。
タイムスタンプには次の3つのタイプがあるそうです。(ちなみにhelpオプションも使えます。)
●タイムスタンプの種類
種類 | 意味 | 確認方法 |
mtime | 最終変更日時 | ls -l |
ctime | アクセス権(パーミッション、所有権など)設定変更日時 | ls -lci |
atime | 最終アクセス日時 | ls -lu |
ちなみに全部のタイムスタンプを一覧で表示する方法はないものかと探したところ、特定のファイルの詳細を表示する方法は見つかりました。[stat (ファイル名)]
ファイルがどの程度のサイズで、アクセス権の設定内容はこうで、といったファイルの詳細が表示されるようです。こちらもオプションがあります。ご興味のある方はリンクをどうぞ。
【 stat 】コマンド――ファイルの属性や日付などを表示する|@IT
●タイムスタンプを変更するときに使えるオプション
オプション | 変更となる対象:日時 | 書き方 |
-a | atime:現在日時 | touch -a (ファイル名) |
-c | ファイルがない場合にはファイルを作成しない | touch -c (ファイル名) |
-d | mtime、ctime、atime:指定 | touch -d “yyyy/mm/dd 00:00:00” (ファイル名) |
-m | mtime:現在日時 | touch -m (ファイル名) |
-r | 他のファイルのタイムスタンプに合わせる | touch -r (既存ファイル名) (変更対象ファイル名) |
-t | 任意の日時に変更 | touch -t YYYYMMDDHHmm.ss |
せっかくなので[-a]オプションを試してみました。上の画像と比較すると確かに変更されています。
参考:
- ヘルプオプション[touch --help]
- UNIX/Linuxの部屋 touchコマンドの使い方|68user's page
- touchコマンドについて詳しくまとめました 【Linuxコマンド集】|エンジニアの入り口
- Linuxのタイムスタンプはmtime、ctime、atimeの3種類。touchコマンドで更新する方法|有限会社エス技研
- touch|IT専科
【cp】を使ってファイルをコピーしてみる。
さて、次にファイルのコピーをしてみます。
P68 引用:
●ファイルやディレクトリのコピー[cp]
ファイルやディレクトリのコピーは[cp(CoPy)]コマンドで行います。
オプションを指定しないといきなり処理が実行されます。確認しながら操作したいときは[-i]オプションを付けます。すでにファイルが存在して上書きになる場合はメッセージが表示されます。
その他
[-r]オプションを付けるとディレクトリの内容を丸ごとコピーします。[-v]オプションで操作後に結果を表示してくれます。
$cp ファイルA ファイルB :ファイルAがファイルBという名前でコピーされます。
$cp ファイルA ディレクトリ:ファイルAはディレクトリにファイルAの名前のままコピーされます。
$cp -r ディレクトリA ディレクトリB:
ディレクトリBがある場合、ディレクトリAはディレクトリBの下にサブディレクトリとしてコピーされます。 ディレクトリBがない場合、ディレクトリAはディレクトリBという名前でカレントディレクトリにコピーされます。
上記以外にはこんなこともできるそうです。
やりたいこと | 書き方 |
複数のファイルをコピーしたい | $cp (ファイルA) (ファイルB) (コピー先ディレクトリ名) |
部分一致のファイルを一括コピー | $cp (aiueo*) (ディレクトリ名) |
というわけで、実践。
ファイルAをコピーして違う名前で保存する[cp](ついでに[-v]で動作確認)
ひとつ目のコピーはhinamatsuriというファイルをコピーして、setsubunという名前で保存したものです。
ふたつ目のコピーはひとつ目と同じですが、オプション[-i]を付けたので、同名のファイルがあるかをチェックした後に、あった場合には上書きするか?をYesかNoで応えます。今回はNoにしたのでnです。
ファイルAを他のディレクトリにコピーする[cp ファイルA ディレクトリ名]
さて次に、他のディレクトリにファイルをコピーさせる方法を試してみます。せっかくなので、オプション[-v]を付けて、動作を確認してみます。
まず作成したファイル(ohanami)を別のディレクトリ(2_natsu)にコピーします。
(2_natsuディレクトリは1_haruディレクトリと同じ階層にいるディレクトリです。)
ディレクトリをファイルごとごっそりコピーする[cp -r]
成功しました。
コピーしてできたディレクトリ(niseharu)は、邪魔なので一度[rm -r]で、ディレクトリの中身ごと削除します。と、ここでふと、ファイルだけを削除するなら[rm]、ディレクトリだけを削除するなら[rmdir]、中身ごと消すなら[rm -r]と、削除するとき、中身の有無によってコマンドが変わることを思い出しました。
そこで気になったのは、コピーするとき、ディレクトリの中にサブディレクトリやさらにその下にファイルがあってもコピーされるのか?と言う点です。
試してみるために、1_haruディレクトリに、[mkdir]を使ってMarch、April、Mayの三つのディレクトリを作成し、さらにAprilにはfoolというファイルを作成しました。
できたのはこんな感じ。では早速、1_haruごとコピーしてみます。
ちゃんとサブディレクトリも、さらにその下にあるファイルもコピーされていました。一安心。
別のディレクトリにファイルをコピーして、別名で保存する
ディレクトリの指定は相対パスか絶対パスでOKです。
($cp (コピー元) (コピー先ファイル名) (ディレクトリ名)ではダメでした。)
絶対パスと相対パスについてはCentOS 7でディレクトリを作ってみよう!記事内の文末にまとめていますので、改めて確認したい方はご参照ください。
CPで使えるオプションはなに?
では[cp]で使えるオプションにはどんなものがあるのでしょうか。上で書いた引用に入っていたものも含めてまとめてみました。
オプション | 内容 |
-i | 同名ファイルがある場合は上書きして良いかを確認する |
-r | ディレクトリごとコピーする |
-v | 操作内容を表示する |
-a | 元ファイルの属性・ディレクトリ構成を(可能な限り)保持してコピー |
-b | ファイルを上書きする場合にバックアップを作成する(画像参照) |
-d | シンボリックリンクをコピーするときに、シンボリックリンクを保有したままにする |
-f | コピー先に同名ファイルがあっても警告なしにコピーする |
-l | ファイルをコピーする代わりにファイルへのハードリンクを作成する |
–no-preserve | 指定した属性を保持しない (all、timestamps、ownership、mode、context、links、xattr) |
-p | 所有者、所有グループ、パーミッション、タイムスタンプを保持 |
ところで、[-b]オプションを使ったときにバックアップはどこに保存されるのか…。確認のために試しにやってみました。
上書きしたファイル名の最後に「~」をつけて、同じ場所に保存されるようです。
参考リンク:
- ヘルプオプション(cp --help)
- Linuxコマンド「cp」とオプションの使い方(ファイルやディレクトリ・フォルダをコピーする)|プロメモ
それでは今回はこちらで終了です。今回もお付き合いいただきありがとうございました。