KUT経・マネ/プログラミング系授業
今回は、ディレクトリやファイルを操作するためのコマンドをマスターしましょう。
mkdirコマンドは引数に指定した名前のディレクトリを作成します。ディレクトリ名は絶対あるいは相対パスで指定します(以降、全ての場合において、ディレクトリ名やファイル名を指定する際は、絶対パスと相対パスの両方が使えます)。
入力例:
# ホームディレクトリに移動
$ cd
# seminar1ディレクトリを作成(相対パス)
$ mkdir seminar1
# seminar1ディレクトリの存在を確認
$ ls
入力例
# ホームからの相対パスで作成する場合
$ mkdir ~/seminar1
# ホームに移動
$ cd
# 存在を確認
$ ls
ユーザーが指定したパスに対する書き込み権限をもっていない場合はエラーとなるので注意しましょう。たとえば、一般ユーザーはルートディレクトリ内の書き込み権限を持っていないので、mkdir /hogeはエラーとなります。通常、一般ユーザーは、ホームディレクトリ以下の全てのディレクトリに対して書き込み権限があり、それ以外の場所には書き込み権限がありません。
rmdirコマンドは、引数に指定した名前のディレクトリを削除します。
# seminar1ディレクトリを削除
$ rmdir seminar1
ただし、rmdirで削除できるのは空のディレクトリだけですので注意しましょう。
文字情報だけを含むファイルをテキストファイルと呼びます。テキストファイルは、各種Linuxコマンドにより、その内容をターミナルに出力することができます。一方、テキストファイル以外(たとえば画像ファイルや動画ファイル)の内容をターミナルに出力することは、通常できません。
豆知識:たとえば、ホームページを構成するHTMLファイルはテキストファイルです。ホームページは画像や動画を含みますが、それらはHTMLファイルとは別のファイルとして保存されているからです。一方、同じ文字を含むファイルでも、Microsoft Office Wordのファイルなどは、文字情報以外に様々な書式情報や図形、画像情報を含むので、テキストファイルではありません。テキストファイルではないファイルをバイナリファイルと呼ぶことがあります。
catコマンドを用いると、引数に指定したファイルの中身を閲覧できます。ファイルの内容を全て画面に表示するので、短いファイルの閲覧に向いています。
入力例:
# ファイル/etc/os-releaseを閲覧
$ cat /etc/os-release
出力例:
NAME="Ubuntu"
VERSION="18.04.6 LTS (Bionic Beaver)"
ID=ubuntu
ID_LIKE=debian
PRETTY_NAME="Ubuntu 18.04.6 LTS"
VERSION_ID="18.04"
HOME_URL="https://www.ubuntu.com/"
SUPPORT_URL="https://help.ubuntu.com/"
BUG_REPORT_URL="https://bugs.launchpad.net/ubuntu/"
PRIVACY_POLICY_URL="https://www.ubuntu.com/legal/terms-and-policies/privacy-policy"
VERSION_CODENAME=bionic
UBUNTU_CODENAME=bionic
lessコマンドは、ファイルの中身を1画面ずつ表示することができるので、特に長いファイルの閲覧に便利です。
入力例:
# CPU情報の閲覧
$ less /proc/cpuinfo
lessでファイルの内容を表示している最中には、ファイル内を移動したり文字列を検索するための様々なキーバインドが利用可能です。
lessコマンドを終了nで次の候補、Shift-nで前の候補)echoコマンドは、引数に与えた文字列を画面に印字するだけの簡単なコマンドですが、随所で役に立ちます。
入力例:
# Hello!と画面に出力
$ echo Hello!
次のようにechoコマンドを使うと、画面だけでなく、ファイルに文字列を出力することが可能です。
入力例:
# 文字列Hello!をファイルhello.txtに出力
$ echo Hello! > hello.txt
$ cat hello.txt
出力例:
Hello!
記号>は、出力先を変更するという意味を持ちます。このような、出力先を変更する操作のことを、標準出力のリダイレクトと呼びます。標準出力とは、出力先を指定しなかった場合の出力先であり、通常はディスプレイを表します。
なお、>記号を使ってリダイレクトすると、出力先のファイルが既に存在する場合、内容を書き換えてしまいます。書き換えるのではなく、出力先のファイルの末尾に文字列を付け足したい場合は、記号>>を使います。
入力例:
$ echo Hello! > hello.txt
# 文字列Goodbye!をファイルhello.txtの末尾に追加
$ echo Goodbye! >> hello.txt
$ cat hello.txt
出力例:
Hello!
Goodbye!
なお、リダイレクト記号の>や>>は、echoだけでなく、標準出力を用いる多くのコマンドの出力先を変更するために使うことができます。たとえば、catコマンドの出力を画面ではなく、ファイルに送ることが可能です。
入力例:
# catの出力をファイルhello2.txtにリダイレクト
$ cat hello.txt > hello2.txt
cpは、第1引数に指定したファイルを、第2引数に指定したパスにコピーします。第2引数がディレクトリの場合は、同じ名前で同じ内容のファイルを、指定したディレクトリ内に作成します。
# ディレクトリmydirを作成
$ mkdir mydir
# ファイルhello.txtを作成
$ echo Hello! > hello.txt
# ファイルhello.txtをmydir/hello.txtにコピー
$ cp hello.txt mydir
第2引数がディレクトリでない場合、それはコピー先のファイル名であるとみなされます。そのファイルが存在しない場合は、新たにその名前のファイルが作成され、第一引数で与えたファイルの内容がコピーされます。すでに存在していれば、上書きでコピーが行われます。
# hello.txtをgoodbye.txtにコピー
$ cp hello.txt goodbye.txt
# 内容が同じか確認
$ cat hello.txt
$ cat boodbye.txt
cpは、オプション-rを付けることにより、ディレクトリをまるごとコピーすることができます。
# ディレクトリmydirを作成
$ mkdir mydir
# ファイルmydir/hello.txtを作成
$ echo Hello! > mydir/hello.txt
# mydirをまるごとmydir2にコピー
$ cp -r mydir mydir2
mvは第1引数に指定したファイルを、第2引数に指定した場所に移動します。mvの挙動はcpとよく似ています。第2引数がディレクトリである場合、ファイルの名前は変更されず、そのディレクトリに移動します。
入力例:
# ディレクトリmydirを作成
$ mkdir mydir
# mydirにhello.txtを移動
$ mv hello.txt mydir
# 移動を確認
$ ls
$ ls mydir
第2引数がディレクトリではない場合、mvはそれがファイル名であるとみなし、その名前にファイル名を変更します。
入力例:
# ファイルhello.txtをgoodbye.txtに名前変更
$ mv hello.txt goodbye.txt
# 確認
$ ls
$ cat goodbye.txt
この場合、第2引数に与えるファイル名は、カレントディレクトリのパスである必要はありません。別のディレクトリのパスを与えると、そのディレクトリに移動すると同時に名前も変更されます。
入力例:
# hello.txtをmydir内に移動してgoodbye.txtに名前変更
$ mv hello.txt mydir/goodbye.txt
mvはディレクトリの名前を変更したり、まるごと移動することも可能です。この場合、特にオプションは必要ありません。
ファイルを削除するには、rmコマンドを使います。引数に削除したいファイルを指定します。
入力例:
# hello.txtを削除
$ rm hello.txt
通常、rmコマンドを実行すると、「削除しますか?」と尋ねられるので、削除するならばyと入力します。削除しない場合はnを入力します。
注: 実際には、rmのデフォルトの挙動では、何も確認せずに即座に削除が行われます。rmコマンドは、オプション-iを付けることにより、削除前に確認が行われるようになります。ただ、Ubuntuでは、各ユーザーの初期状態において、rmと入力すればrm -iが実行されるように設定されています。このように、あるコマンドに付けられた別の名前をのことをエイリアスと呼びます。この場合rmはrm -iのエイリアスとなっています。オプション-iを無効にするにはオプション-fをつけます。
入力例:
# hello.txtを強制削除
$ rm -f hello.txt
ただし、-fオプションは危険なので、通常は使わないようにし、どうしても必要な場合には慎重に使うようにしましょう。
rmコマンドは、同時に複数のファイルを指定できます。
# 3つのファイルを削除
$ rm hello.txt hello2.txt hello3.txt
rmコマンドを使うと、空でないディレクトリも削除することができます。そのためには、引数にディレクトリを指定し、-rオプションを付けます。
入力例:
# mydir内にファイルを作成
$ mkdir mydir
$ echo Hello! > mydir/hello.txt
# これはうまくいかない
$ rmdir mydir
# 代わりにこうする
$ rm -r mydir
ファイルが沢山あるディレクトリでは、いちいち確認を求められると大変ですので、そのようなディレクトリを削除するには、同時に-fオプションを指定します。
入力例:
# 空でないディレクトリmydirを強制削除
$ rmdir -rf mydir
maindirを作成しなさい。maindirの中にsubdir1とsubdir2を作成しなさい。subdir1の中に、In subdir1という文章が書かれたテキストファイルfile1.txtを作成しなさい。file1.txtの内容をcatコマンドで確認しなさい。file1.txtを、同じディレクトリのファイルfile2.txtにコピーしなさい。lsコマンドで、ファイルが二つになっていることを確認しなさい。file2.txtの名前をFILE2.txtに変更しなさい。FILE2.txtを、名前を変更せずにディレクトリsubdir2に移動しなさい。subdir2ディレクトリに移動し、実際にファイルが移動していることをlsコマンドで確認しなさい。subdir2内のファイルFILE2.txtの末尾に、Moved to subdir2という文をリダイレクト>>により追記しなさい。catコマンドにより、ファイルFILE2.txtの内容を確認しなさい。FILE2.txtをホームディレクトリに同じ名前でコピーしなさい。subdir1内のファイルfile1.txtを削除しなさい。subdir1を削除しなさい。maindirを、中身の全てのディレクトリ・ファイルもろとも削除しなさい。