The Sixwish project

Linux - Education

cp、mv、rm

マウスでDrag & Drop、そこに、Ctrlキーとかをあわせればファイルのコピー・移動できるのがWindows。
それをコマンドではどう行なうのか……コピー、移動、削除は基本中の基本。
……というわけで基本コマンドの二回目です。

それでは、ログインしてください。

cp

まずはファイルコピーのコマンド、cpからです。

基本的には、コピー元のファイル名とコピー先のファイル名を指定する必要があります。
まずは、どう行なうのかを前回作成したファイルをコピーして確認します。

[maya@sixwish ~]$ ls
base  file_0.txt
[maya@sixwish ~]$ ls ./base/
dir1
[maya@sixwish ~]$ cp ./file_0.txt ./base/file_0.txt
[maya@sixwish ~]$ ls ./base/
dir1  file_0.txt
[maya@sixwish ~]$

コマンドは、cp コピー元 コピー先の順序で指定します。
このコピー元とコピー先は、絶対パス、相対パスどちらで指定しても構いません。

上記の方法が基本になりますが、これを応用するといろいろな方法でコピーを行なうことが可能です。
まずは名前を変えてコピーする方法から。

[maya@sixwish ~]$ cp ./base/file_0.txt ./base/file_1.txt
[maya@sixwish ~]$ ls ./base/
dir1  file_0.txt  file_1.txt
[maya@sixwish ~]$

コピー元とコピー先を指定するので、簡単に変えることができるわけです。
バックアップを残す場合に良く使う手法ですので覚えておいてください。

さて、いまのところは、いちいちlsで確認していますが、cpが何をやったかを表示するオプションがあります。
次はソレを指定して実行してみます。

[maya@sixwish ~]$ cp -v ./base/file_1.txt ./file_2.txt
`./base/file_1.txt' -> `./file_2.txt'
[maya@sixwish ~]$ ls
base  file_0.txt  file_2.txt
[maya@sixwish ~]$

さて、オプション-vですが、verboseの略となっています。
前回のmkdirでつけたオプションの短縮版です。
一応、--verboseでも同じ効果を得ることが出来ます。

では、次に複数ファイルをまとめてコピーしてみます。
これは実行した時にわかりにくいので、さっきのverboseのオプションをつけて実行します。
更に、複数まとめてなので確認メッセージを表示するオプション-iもつけます。

[maya@sixwish ~]$ ls
base  file_0.txt  file_2.txt
[maya@sixwish ~]$ ls base/
dir1  file_0.txt  file_1.txt
[maya@sixwish ~]$ cp -i --verbose * ./base/
cp: omitting directory `base'
cp: `./base/file_0.txt' を上書きしてもよろしいですか(yes/no)? y
`file_0.txt' -> `./base/file_0.txt'
`file_2.txt' -> `./base/file_2.txt'
[maya@sixwish ~]$ ls ./base/
dir1  file_0.txt  file_1.txt  file_2.txt
[maya@sixwish ~]$

まず、コピー元に使った*について。
*(アスタリスク)はどんな文字に対しても、それが何文字であっても一致するという意味をもつ記号です。
応用で前方一致file*や、後方一致*.txtというようにしてコピーを取ることが出来ます。

また、cpを実行した後にomitting directoryと出ていますが、これはエラー表示です。
基本的に、ディレクトリまでコピーするというオプションを指定しない限り、ディレクトリまでコピーはされません。
ゆえに、ディレクトリのコピーは省略しましたという意味のメッセージが表示されたわけです。

更に表示された上書き確認のメッセージですが、これは、オプション-iをつけているので、上書きしてよいか?と聞いてくるわけです。
ここで、オプション-iをはずして実行すると、問答無用で上書きしてしまうので注意してください。
また、コピー先に同名のファイルが存在しない場合は、確認メッセージは表示されません。

では、ディレクトリのコピーはどうすればよいか?
ということで、ディレクトリまでコピーする、再帰的コピーを実行してみます。

[maya@sixwish ~]$ ls
base  file_0.txt  file_2.txt
[maya@sixwish ~]$ cp -rv ./base base2
`./base' -> `base2'
`./base/file_2.txt' -> `base2/file_2.txt'
`./base/file_0.txt' -> `base2/file_0.txt'
`./base/file_1.txt' -> `base2/file_1.txt'
`./base/dir1' -> `base2/dir1'
`./base/dir1/dir2' -> `base2/dir1/dir2'
[maya@sixwish ~]$ ls
base  base2  file_0.txt  file_2.txt
[maya@sixwish ~]$

途中にコピーされた結果が表示されているのでbase2ディレクトリの中は見ませんが、baseと同じになっていると思います。

さて、ここまででコピーについては終わりになります。

rm

次は削除するためのコマンドです。
削除はdeleteでは無く、removeを略した、rmというコマンドになります。

それでは、ここまでで無駄にコピーしてきたファイルを削除してみましょう。

[maya@sixwish ~]$ ls
base  base2  file_0.txt  file_2.txt
[maya@sixwish ~]$ rm file_0.txt
[maya@sixwish ~]$ ls
base  base2  file_2.txt
[maya@sixwish ~]$

確認も何もなしに削除します。
これはディストリビューションなどによっても異なりますが、基本的には確認は出ません。

そこで、強制的に確認が入るようにして実行してみます。

[maya@sixwish ~]$ rm -iv file_2.txt
rm: remove 通常の空ファイル `file_2.txt'? y
removed `file_2.txt'
[maya@sixwish ~]$ ls
base  base2
[maya@sixwish ~]$

cpでも使用したオプション-i-vです。
それぞれ、cpのオプションと同じ意味をもっていて、確認と詳細表示になります。

では、次にディレクトリごと削除してみます。

[maya@sixwish ~]$ ls
base  base2
[maya@sixwish ~]$ cd base
[maya@sixwish base]$ ls
dir1  file_0.txt  file_1.txt  file_2.txt
[maya@sixwish base]$ ls dir1/
dir2
[maya@sixwish base]$ ls dir1/dir2/
[maya@sixwish base]$ rm dir1
rm: cannot remove `dir1': ディレクトリです
[maya@sixwish base]$

ディレクトリを削除するには、rmにオプションをつけるか、rmdirを使用します。

まずはrmdirを使って削除してみます。

[maya@sixwish base]$ rmdir dir1
rmdir: `dir1': ディレクトリは空ではありません
[maya@sixwish base]$ rmdir dir1/dir2
[maya@sixwish base]$

このコマンドには制約があり、空になったディレクトリしか削除できません。
なので、rmコマンドに再帰的に削除するオプションをつけて実行して、一括削除します。

[maya@sixwish base]$ ls
dir1  file_0.txt  file_1.txt  file_2.txt
[maya@sixwish base]$ cd ../
[maya@sixwish ~]$ ls
base  base2
[maya@sixwish ~]$ rm -irv base
rm: descend into directory `base'? y
rm: remove 通常の空ファイル `base/file_2.txt'? y
removed `base/file_2.txt'
rm: remove 通常の空ファイル `base/file_0.txt'? y
removed `base/file_0.txt'
rm: remove 通常の空ファイル `base/file_1.txt'? y
removed `base/file_1.txt'
rm: remove ディレクトリ `base/dir1'? y
removed directory: `base/dir1'
rm: remove ディレクトリ `base'? y
removed directory: `base'
[maya@sixwish ~]$

これで、ディレクトリを丸ごと削除することが出来ました。
ついでなので、もう一つあるほうを、強制的に削除してみましょう。

[maya@sixwish ~]$ rm -frv base2
removed `base2/file_2.txt'
removed `base2/file_0.txt'
removed `base2/file_1.txt'
removed directory: `base2/dir1/dir2'
removed directory: `base2/dir1'
removed directory: `base2'
[maya@sixwish ~]$

-fは、強制的に削除するという意味をもちます。
このオプションをつけた場合は、特に確認せずに削除してしまうので注意してください。

rm -fr /

削除の確認をしないのが-fオプション。
なので、間違ってroot権限でrm -fr /なんてことをやると、全てのファイルが削除され、何も出来なくなってしまいます。

ちなみに、洒落で実行したことがありますが、コンソールだけは生きてた……コマンドは実行できなかったけど。