6.5 ファイルの管理
Linux Essentials Online Text | 2021/07/21

ファイルのコピー(cp)

ファイルを扱う上でファイルを複製するなどコピーが必要になることがあります。コピーを行う場合は「cp(CoPy)」コマンドを使用します。cpコマンドは、ファイルを複製や新しくできた複製ファイルのファイル名を指定することができます。

書式:

cp [オプション] コピー元 コピー先

主なオプション:

-iコピー先に既にファイルが存在する場合に上書きの可否を確認します。
-fこのオプションで実行すると上書き確認を無視し、強制的にコピーします。
-rディレクトリをコピーします。cpは原則としてファイルをコピーする機能のみですが、ディレクトリの中の全てのファイル・ディレクトリのコピーが可能です。
-p普通に実行すると、ユーザ名・属性・更新日時などが実行時の情報でコピーされますが、このオプションをつかうと元ファイルの情報を保持して保存します。

[コピー元]に指定したファイルを[コピー先]に指定したディレクトリの配下に、[コピー元]と同じファイル名でコピーします。[コピー先]にファイル名を指定した場合は、その名前に変換されてコピーされます。
また、[コピー先]に[コピー元]と同じファイル名の場合、ファイルであるかディレクトリであるかに関係なく[コピー元]に上書きされます。

<実習: cpコマンドの実行>

cp コマンドを使って、実際にファイルをコピーしてみましょう。

$ cd
$ cp /etc/hosts .
$ ls
$ hosts

「.(ドット)」はカレントディレクトリ(今いるディレクトリ)を表します。最初にcdコマンドを使ってホームディレクトリに戻っていますので、上記は、/etcディレクトリにある「hosts」というファイルをホームディレクトリにコピーする、という意味になります。

次に、hostsファイルを別の名前でコピーします。

$ cp hosts hosts.bak
$ ls
hosts  hosts.bak

hostsファイルがコピーされてhosts.bak というファイル名で保存されました。

コピー先に同じファイルがある場合

コピー先に既に同名のファイルがある場合の処理について確認してみましょう。

$ ls -l hosts
-rw-r--r--. 1 lpic-user lpic-user 158  5月 28 02:10 hosts
$ cp /etc/hosts .
$ ls -l hosts
-rw-r--r--. 1 lpic-user lpic-user 158  5月 28 02:12 hosts
$ cp -i /etc/hosts .
cp: `./hosts' を上書きしますか? Y   ← [Y]キーを押下して[Enter]キーを押します。
$ ls -l hosts
-rw-r--r--. 1 lpic-user lpic-user 158  5月 28 02:15 hosts
$ cp -f /etc/hosts .
$ ls -l hosts
-rw-r--r--. 1 lpic-user lpic-user 158  5月 28 02:19 hosts

コピー先に同名のファイルがある場合、CentOSでは、そのまま上書きしますが、「-i」オプションを使用すると、上書きするかどうかを事前に確認することができます。この時、[Y]キーを押下すると上書き、[N]を押下するとコピー処理を取りやめます。逆に「-f」オプションを使用した場合は、確認することなく強制的に上書きを行います。

同じファイル情報でコピーする

今度は「-p」オプションを使ってコピーしてみましょう。

$ cp –p hosts hosts.new
$ ls -l
合計 12
-rw-r--r--. 1 lpic-user lpic-user 158  5月 28 02:19 hosts
-rw-r--r--. 1 lpic-user lpic-user 158  5月 28 02:23 hosts.bak
-rw-r--r--. 1 lpic-user lpic-user 158  5月 28 02:19 hosts.new

hostsファイルがコピーされてhosts.newというファイル名で保存されました。また、hostsの更新日時がそのまま引き継がれているのが分かります。cpコマンドはコピーするコマンドですが、コピーで作成されたファイルのタイムスタンプはコマンドを実行した日時になります。タイムスタンプを継承したい場合は「-p」オプションを使って実行しましょう。

ディレクトリのコピー

cp コマンドは、ファイルをコピーするためのコマンドであるため、原則としてディレクトリのコピーはできません。しかし、「-r」オプションを使用することで、ディレクトリのコピーが可能になります。

$ cp -r /var/log .

上記例では、/var/logディレクトリをコピーしています。
/var/logはシステムログが格納されるディレクトリで、一般ユーザ権限で閲覧できないディレクトリやファイルが多数存在します。そのため多数のエラーが表示されますが、一般ユーザ権限でも閲覧可能なディレクトリやファイルは存在するため、それらのコピーは可能です。

実行したら、lsコマンドで確認してみましょう。ホームディレクトリにlogディレクトリがコピーされているのがわかります。もちろん、格納されているディレクトリやファイルもそのままコピーされます。

$ ls
hosts  hosts.bak  hosts.new  log
$ ls log

ファイルの移動(mv)

ファイルを移動するときに利用するコマンドが、「mv(MoVe)」コマンドです。また、mv コマンドを使ってファイル名の変更も行えます。

書式:

mv [オプション] 移動元 移動先

主なオプション:

-i移動先にファイルが存在する場合、上書きの可否を確認して実行します。
-fこのオプションで実行すると確認のための問い合わせも無視し、強制的にコピーを続けます。

使い勝手としては「cp(CoPy)」コマンドと似ていますが、mvは移動コマンドなので、元のファイルが残りません。

このコマンドは、移動元、移動先がファイル、ディレクトリの組み合わせによって動作が変わります。特に、同じ名前のディレクトリ先にディレクトリを移動しようとした時、上書きされないことに注意して下さい。

 移動先がファイル移動先がディレクトリ
移動元が
ファイル
移動元ファイルが、移動先ファイル名に変更されて移動します。
移動先と移動元が同名なら上書き。
移動元ファイルが、移動先ディレクトリの配下に移動元ファイル名のまま移動。
移動元が
ディレクトリ
移動できません。移動元ディレクトリが、移動先ディレクトリ名に変更されて移動。
移動先が移動元と同名の場合は移動先ディレクトリの配下に移動。

<実習: mvコマンドの実行>

ファイルhostsを/tmpに移動します。

$ ls
hosts  hosts.bak  hosts.new  log
$ mv hosts.new /tmp
$ ls /tmp/
$ hosts.new
$ ls
hosts  hosts.bak  log

1、2行目:コマンド実行前のファイルを確認します。
3行目:ファイルhosts.newが/tmp/に移動するコマンドを実行。
4、5行目:/tmpディレクトリに、hosts.newが存在することを確認。
6、7行目:hosts.newが無くなっていることを確認。

コピー先に同じファイルがある場合

移動先に同名のファイルがある場合、cpコマンドと同様、デフォルトでは勝手に上書きしますが、オプションで挙動を変更できます。

$ mv -i /tmp/hosts.new ~/hosts
mv: `hosts' を上書きしますか? Y
$ ls /tmp
$ ls
hosts  hosts.bak  log

mvコマンドでファイル名をCpコマンドと同様、「-i」オプションを使用すると、上書きするかどうかを事前に確認することができます。この時、[Y]キーを押下すると上書き、[N]を押下するとコピー処理を取りやめます。逆に「-f」オプションを使用した場合は、確認することなく強制的に上書きを行います。

ファイル名の変更

mvコマンドの利用方法の一つにファイル名をリネームがあります。
ファイルをリネームする場合は、下記のようなコマンドを実行します。

$ mv hosts hosts.new
$ ls
hosts.bak  hosts.new  log

コマンドの意味としては「同じ場所にファイル名を変えて移動する」となり、=「ファイルのリネーム」というわけです。

ファイルの削除(rm)

作成したファイルを削除する必要があるときに利用するコマンドが「rm(ReMove)」コマンドです。

書式:

rm [オプション] 削除対象

主なオプション:

-i対象ファイルを本当に削除してよいか、確認して処理を実行します。
-fこのオプション使って実行すると確認を無視して強制的に処理を継続します。
-rディレクトリを対象にします。ディレクトリ内の全てのファイルやディレクトリも削除します。

Windowsでの削除は「ゴミ箱」という名のフォルダにファイルを移動するだけですが、rmコマンドはシステム上から完全に消去します。そのため削除したファイルを復活させることはできません。また、rmコマンドは(オプション無しでは)ディレクトリを削除することはできません。ディレクトリの削除には、後述のrmdirコマンドを使用します。

<実習: rmコマンドの実行>

rmコマンドを使って実際にファイルを削除します。

$ ls
hosts.bak  hosts.new  log
$ rm hosts.bak
$ ls
hosts.new  log

ディレクトリの削除

rmコマンドはファイルを削除するコマンドですので、本来ディレクトリを削除することはできません。
ディレクトリを削除する場合は「-r」オプションを使用します。

$ ls
hosts.new  log
$ rm log
rm: `log' を削除できません: ディレクトリです
$ rm –r log
$ ls
hosts.new

ファイルのタイムスタンプの変更(touch)

Linuxのファイルには3種類のタイムスタンプが存在します。mtime(最終更新日時)、ctime(アクセス権の更新日時)、atime(最終アクセス日時)です。touchコマンドはこれらのタイムスタンプを変更します。また、ファイル名が存在していない場合、touch コマンドは中身が空である0バイトのファイルを作成します。

上記の通り、touchコマンドはファイルのタイムスタンプを変更するためのコマンドですが、空のテキストファイルを作成する時にも使用するコマンドです。

書式:

touch [オプション] ファイル名

主なオプション:

-t全ての日時を「[[CC]YY]MMDDhhmm[.ss]」形式で指定した日時に変更します。
-d全ての日時を日付(CCYY/MM/DD or CCYY-MM-DD)か時間(hh:mm)に変更します。
-actimeとatimeを変更します。-tと組み合わせて使用する。
-mmtimeとctimeを変更する。-tと組み合わせることができる。

<実習: 最終変更日時の変更の確認>

以下の通り、既存のファイルをtouchコマンドで指定すれば日時が変更されます。

$ ls -l hosts.new
-rw-r--r--. 1 lpic-user lpic-user 158  5月 28 02:19 hosts.new
$ touch hosts.new
$ ls -l hosts.new
-rw-r--r--. 1 lpic-user lpic-user 158  5月 28 03:42 hosts.new

<実習: touchコマンドによるファイル作成>

touchコマンドで存在しないファイル名を指定すると新しいファイルが作成されます。サイズが0バイトです。

$ ls -l touch_file
ls: touch_file にアクセスできません: そのようなファイルやディレクトリはありません
$ touch touch_file
$ ls -l touch_file
-rw-rw-r--. 1 lpic-user lpic-user 0  5月 28 03:54 touch_file
PAGE TOP