ファイル操作
最新の状況が反映されているのは 2017年度版 の教材です。
古いバージョンは各種ソフトウェアの最新情報を反映しておらず、指示通りに進めても正常に動作しない恐れがありますので、学習を開始される方は 2017年度版 を利用されることを強くおすすめいたします。(学習する内容はほぼ同じになっております。)
なお、この2016年度版の教材は 2018年3月 をもって公開を終了する予定です。
この回では、Linux におけるディレクトリとファイルの操作がコマンドできるようになり、 Ubuntu と元の OS との間で、共有フォルダを利用できるようになります。
コマンドでのファイル操作ができると、何度も似たようなファイルをコピーしなくてはいけない作業をする際、ミスなく一瞬で作れるようになります。
これは素晴らしいことです。
ファイルとは
まずファイルとはなんでしょうか?
ファイルとは、OS においてストレージに格納されるデータのまとまりのことを表します。
このファイルを実現するために、 OS はファイルシステムを持っています。
これらファイルシステムによって、ファイルやディレクトリという単位によるストレージ管理が実現されるのです。
ファイルとディレクトリ
ファイルは、ディレクトリによってまとめることができます。
.
├── directory1
│ ├── file1-1
│ └── file1-2
├── directory2
│ ├── directory2-1
│ │ ├── file2-1-1
│ │ └── file2-1-2
│ └── directory2-2
├── file3
└── file4
ディレクトリの中にファイルを含めて、まとめることができます。
さらに、上記のようにディレクトリを入れ子にすることができます。
また OS によってはこのディレクトリのことをフォルダと呼ぶことがあります。
ファイルとディレクトリをコマンドで扱ってみよう
Linux でディレクトリを扱うために、 8 つのコマンドを紹介します。
コマンド | できる操作 |
---|---|
pwd | 現在のディレクトリの表示 |
ls | ファイル・ディレクトリの一覧の表示 |
cd | 現在のディレクトリの変更 |
mkdir | ディレクトリの作成 |
rm | ファイルやディレクトリの削除 |
cp | ファイルやディレクトリのコピー |
mv | ファイルやディレクトリの移動 |
find | ファイル・ディレクトリの検索 |
多いですが、必要になった時に調べながら使って行くことができれば十分です。
「linux コマンド コピー」などと検索サイトで検索しても、必要な cp コマンドを見つけることができるでしょう。
それでは、ひとつずつ使い方を見ていきましょう。
まずは vagrant を立ち上げます。
Windows では、コマンドプロンプトより以下を入力します。
cd %USERPROFILE%\vagrant\ubuntu64
vagrant up
RLogin を起動し、 vagrant と書いてある行をダブルクリックします。
Mac では、「ターミナル.app」へ、以下を入力します。
cd ~/vagrant/ubuntu64
vagrant up
vagrant ssh
pwd コマンド
pwd は、Print Working Directory の略称で、このコマンドが実行された時点での、現在のディレクトリを表示してくれます。
現在いるディレクトリは英語で Current Directory と書くことから、カレントディレクトリとも呼びます。
pwd
と入力すると
/home/vagrant
と表示されるのではないでしょうか。これが現在のディレクトリです。
最上位からみて、 home
というディレクトリ内の vagrant
の中にいる、ということを示しています。
なお最上位のディレクトリは、 / と表し、ルートディレクトリと呼びます。
また、/ でつながれたディレクトリの位置を表す文字列をパスと呼びます。
パスの書き方には、
- 絶対パス: ルートディレクトリからのパス
- 相対パス: 現在のディレクトリ(カレントディレクトリ)からのパス
という 2 つの書き方があり、例えば、現在のディレクトリ(カレントディレクトリ)が /home
の時、絶対パス /home/vagrant
を相対パスで表すと、./vagrant
となります。
また、 ./
を省いて vagrant
と書くこともできます。
ls コマンド
ls は LiSt の略から名付けられたコマンドで、現在のディレクトリにあるファイルとディレクトリの一覧を表示してくれます。
ls -a
と入力してみましょう。
-a
は. (ドット) で始まるファイルも含めて、全て表示するというオプションです。
. .. .bash_history .bash_logout .bashrc .cache .profile .ssh
と表示されたのではないでしょうか。
これら. (ドット)で始まる名前のファイルは、特別なファイルです。
- . は、現在のディレクトリを指し示すディレクトリ
- .. は、ひとつ上の階層のディレクトリ
です。
その他の . で始まるファイル(ドットファイル、という)は、ユーザーが作ることができますが、様々なソフトウェアによって作られる設定ファイルや、一時的なファイルであることが多いです。
例えば
.bash_history .bash_logout .bashrc .cache .profile .ssh
これらは SSH やコンソール自体の表示に関わる設定や、入力したコマンドの履歴、一時的なファイルです。
ls コマンドに -a
オプションを付けない場合は、ドットファイルは ls の結果として表示されません。
cd コマンド
cd は、Change Directory の略から名付けられたコマンドで、現在のディレクトリを変更します。第一引数に、移動先のディレクトリを記述します。
cd ..
pwd
と入力してみましょう。
/home
と表示されたのではないでしょうか。
..
はひとつ上のディレクトリを表すので、これまでいた /home/vagrant
の一つ上のディレクトリ /home
に移動したのです。
また、この時点で
ls
と入力すると、
ubuntu vagrant
と表示されるのではないかと思います。
この /home
ディレクトリの中には、 ubuntu
ディレクトリと vagrant
ディレクトリの 2 つがあることがわかります。
cd vagrant
pwd
と入力してみましょう。すると
/home/vagrant
と表示されるので、元のディレクトリに戻ってこれたことがわかります。
また、
cd /
pwd
と入力してみましょう。すると
/
と表示されます。つまり、ルートディレクトリに移動しました。ここで
ls
と入力すると、以下のように表示され、ルートディレクトリには大量のディレクトリが存在していることがわかります。
bin dev home lib lost+found mnt proc run srv tmp vagrant vmlinuz
boot etc initrd.img lib64 media opt root sbin sys usr var
以上を確認したら、今度は下記のように入力しましょう。
cd ~
pwd
pwd
の結果は、下記のように表示されるはずです。
/home/vagrant
先ほどのコマンドに現れた ~ (チルダ) は、ホームディレクトリを表します。
ホームディレクトリは、この Ubuntu にアクセスしているユーザーが、自由にファイルシステムを利用して良い領域です。
Windows や Mac で「ユーザーフォルダ」「個人フォルダ」などと呼ばれている場所に相当します。
今は vagrant というユーザーでログインしているので、ホームディレクトリは /home/vagrant
であり、cd ~
は、 cd /home/vagrant
と同様の意味となります。ディレクトリを移動していて困ったときは、cd ~
を入力して、一度ホームディレクトリに戻ってきましょう。
mkdir コマンド
mkdir は、MaKe DIRectory の略から名付けられたコマンドで、ディレクトリを作成することができます。第一引数に作成するディレクトリ名を記述して使います。
mkdir workspace
mkdir tmp
ls
と入力すると
tmp workspace
と表示されるのではないでしょうか。
tmp という一時ディレクトリと workspace という作業用ディレクトリが作成できました。
なお tmp は temporary の略称でよく使われる書き方です。
rm コマンド
rm は、ReMove の略から名付けられたコマンドで、ディレクトリやファイルを削除します。第一引数に削除するディレクトリまたはファイル名を記述して使います。
cd tmp
mkdir a
mkdir b
ls
rm a
まず tmp ディレクトリ内に移動し、a と b いうディレクトリを作り、ls
でディレクトリが作成されたことを確認してから、 rm コマンドで a を削除しようとしています。
ところが、
rm: cannot remove ‘a’: Is a directory
と表示されてしまうかと思います。
「rm では a というディレクトリを削除できない」と表示されています。
実は、 ディレクトリは rm コマンドで消す際には -r
というオプションを付けるか、 rmdir という別のコマンドで削除しなくてはいけません。
rm -r a
上記のコマンドで削除が行えました。
確認してみましょう。
ls
a は rm -r
によって削除したので、残る b だけが表示されるはずです。
cp コマンド
cp は、CoPy の略から名付けられたコマンドで、ファイルやディレクトリをコピーすることができます。
第一引数にコピー元のファイルやディレクトリ名を、 第二引数にコピー先のファイルやディレクトリ名を記述します。
cd ~
cp -r tmp workspace
上記のコマンドは、tmp ディレクトリを workspace の中にコピーするというものです。
-r
はディレクトリの中身も含めて、再帰的にコピーするというオプションです。
tmp ディレクトリの中には b というディレクトリがあるので、それも一緒にコピーしてしまいます。
cd workspace
ls
これで、workspace 内にも tmp ディレクトリができていることがわかります。
tmp
mv コマンド
mv は、MoVe の略称で、 ファイルやディレクトリを移動します。名前を変更するのにも使います。
第一引数に移動するファイルやディレクトリ名を、 第二引数に移動先のディレクトリか、変更するディレクトリ名、またはファイル名を記述します。
cd ~/tmp
ls
以上のコマンドで b ディレクトリがあることを確認したら、ディレクトリの移動を試してみましょう。
mv b c
ls
b ディレクトリが c ディレクトリに名前が変更されたことがわかります。
cd ~
mv tmp/c workspace/tmp
ls workspace/tmp
今度は、ホームディレクトリに移動した後、tmp/c ディレクトリを、 workspace/tmp の中に移動するというコマンドです。
ls workspace/tmp
で確認した結果として
b c
と表示されます。
find コマンド
find は、英単語 Find がそのままコマンド名になっていて、ファイルを探すことができます。
cd ~
find
以上のように実行すると、以下のようにカレントディレクトリの全てのファイルが表示されます。
.
./.ssh
./.ssh/authorized_keys
./.profile
./tmp
./workspace
./workspace/b
./workspace/c
./.bash_logout
./.bashrc
./.bash_history
./.cache
./.cache/motd.legal-displayed
なお、検索したいディレクトリや、条件を与えて検索することもできます。
第一引数に検索したいディレクトリ名を、その後にオプションで検索条件を記述します。
cd ~
find . -name b
こうすると、カレントディレクトリ以下から、名前が b のファイルとディレクトリが検索され、
./workspace/b
と表示されます。find
はファイルを探すのに非常に便利です。
コマンドの使い方を知るためのコマンドに man コマンドというコマンドがあります。
man コマンドの使い方を見てみましょう。
man man
上記のように書きます。man コマンドの第一引数に man という文字列を与えています。
以上のように表示されたのではないでしょうか。
このマニュアルは、矢印キーの ↑ ↓、または j キー か k キーで上下に移動し、 q キーで終了することができます。
しかし残念ながら、説明の部分が英語になっているので、その部分をコピーし、 Google 翻訳などのサイトで翻訳してみましょう。
man is the system's manual pager. Each page argument given to man is normally the name of a program, utility or function. The
manual page associated with each of these arguments is then found and displayed. A section, if provided, will direct man to look
only in that section of the manual. The default action is to search in all of the available sections following a pre-defined
order ("1 n l 8 3 2 3posix 3pm 3perl 5 4 9 6 7" by default, unless overridden by the SECTION directive in /etc/manpath.config),
and to show only the first page found, even if page exists in several sections.
「Google 翻訳」 と Google などの検索サイトで検索してアクセスし、先ほどの英語の部分を貼り付けて翻訳すると。以下のように翻訳されます。
男は、システムのマニュアルページャです。人間に与えられた各ページの引数は、通常のプログラム、ユーティリティまたは関数の名前です。ザ・これらの引数のそれぞれに関連したマニュアルページが見つかり、表示されています。セクションでは、提供されている場合、人を指示すると、検索します唯一のマニュアルのそのセクションインチデフォルトのアクションは、以下の利用可能なすべてのセクションで事前に定義された検索することです順序(デフォルトで「1 NL8323posix15時3PERL54967」、/etc/manpath.configでSECTIONディレクティブで上書きされない限り)、そして、ページがいくつかのセクションに存在していても、見つかった最初のページのみを表示します。
man コマンドが、男と誤訳されていますが、大体雰囲気をつかむことができるのではないかと思います。
man はマニュアルをページごとに表示してくれ、引数としてプログラムの名前を渡すと使える、ということが汲み取れれば十分です。
man コマンドが、「男」と誤訳されていますが、大体の雰囲気をつかむことができるのではないかと思います。
man はマニュアルをページごとに表示してくれて、引数としてプログラムの名前を渡すと使える、ということが読み取れれば十分です。
プログラミングの世界では英語の情報が非常に多く登場します。
その際に一つ一つ翻訳しながら進めていくこともいいですが、ざっと概要を知るために翻訳サイトを利用するというのも一つの手です。
また、man のように有名なコマンドの使い方であれば、Google などのサイトで 「man コマンド」と検索することで日本語の説明を利用することができるでしょう。
共有フォルダを利用できるようにしてみよう
では、ファイルとディレクトリを理解した所で、 Ubuntu と元の OS との間に、共有フォルダ(共有ディレクトリ)を作成してみましょう。
Windows の場合:
C:\Users\${あなたのWindowsログイン名}\vagrant\ubuntu64
の中に workspace フォルダを作成し、
VS Code で以下のファイルを開いてみましょう。
C:\Users\${あなたのWindowsログイン名}\vagrant\ubuntu64\Vagrantfile
Mac の場合:
/Users/{あなたのMacログイン名}/vagrant/ubuntu64
の中に workspace フォルダを作成し、
VS Code で以下のファイルを開いてみましょう。
/Users/${あなたのMacログイン名}/vagrant/ubuntu64/Vagrantfile
そこで、41行目のコメントがない行に
config.vm.synced_folder "./workspace", "/home/vagrant/workspace"
をコピーし、追記して下さい。
なお Windows の場合は、次の通り、特別な対応が必要ですので注意してください。
Windows の方は、先ほど足した行の下に、さらに 3 行書いて、次のようにします。
config.vm.synced_folder "./workspace", "/home/vagrant/workspace"
config.vm.provider :virtualbox do |vb|
vb.customize ["setextradata", :id, "VBoxInternal2/SharedFoldersEnableSymlinksCreate//home/vagrant/workspace","1"]
end
更に加えて、今後この Linux のマシンで利用できるメモリの量を増やすために、46 - 52 目付近にある
# config.vm.provider "virtualbox" do |vb|
# # Display the VirtualBox GUI when booting the machine
# vb.gui = true
#
# # Customize the amount of memory on the VM:
# vb.memory = "1024"
# end
と記述してある部分の config.vm.provider
で始まる行と、 vb.memory
で始まる行と、
end
で始まる行の前についている行、計 3 箇所の #
を取り除いてください。
config.vm.provider "virtualbox" do |vb|
# # Display the VirtualBox GUI when booting the machine
# vb.gui = true
#
# # Customize the amount of memory on the VM:
vb.memory = "1024"
end
作業完了したら、ファイルを上書き保存してください。
設定を反映させるため、vagrant を再起動します。
Windows では:
管理者として立ち上げたコマンドプロンプトへ、以下を入力します。
fsutil behavior set SymlinkEvaluation L2L:1 R2R:1 L2R:1 R2L:1
cd %USERPROFILE%\vagrant\ubuntu64
vagrant reload --provision
右クリックからコピーして貼り付けるを繰り返し、一行ずつ入力してください。
起動が終了したら、RLogin を起動し、 vagrant と書いてある行をダブルクリックして、Ubuntu コンソールを開きます。
Mac では:
「ターミナル.app」 へ以下を入力します。
cd ~/vagrant/ubuntu64
vagrant reload
vagrant ssh
これで、Vagrantfile が置いてあるフォルダの workspace フォルダは、 Ubuntu 内の workspace ディレクトリとの間で、同期を取ってくれるようになりました。
なお、一旦 workspace フォルダの中身は空になってしまいます。
共有フォルダが機能していることを確かめてみましょう。
Ubuntu のコンソールで
cd ~
mkdir workspace/tmp
と入力して、tmp ディレクトリを作りましょう。
すると、Windows または Mac の workspace フォルダにも tmp フォルダが追加されるはずです。
まとめ
- ディレクトリは、 ファイルをまとめて、入れ子にすることができる
.
はカレントディレクトリ、..
はひとつ上のディレクトリを表す/
でつないで表したファイルやディレクトリの位置のことをパスと言う
新しく習った Linux コマンド
コマンド | できる操作 |
---|---|
pwd | 現在のディレクトリの表示 |
ls | ファイル・ディレクトリの一覧の表示 |
cd | 現在のディレクトリの変更 |
mkdir | ディレクトリの作成 |
rm | ファイルやディレクトリの削除 |
cp | ファイルやディレクトリのコピー |
mv | ファイルやディレクトリの移動 |
find | ファイル・ディレクトリの検索 |
練習
workspace/tmp ディレクトリの中に、以下のようなディレクトリ構成を作成して下さい。
.
./a
./a/a
./a/b
./a/c
./b
./b/a
./b/b
./b/c
ひとつずつ作成することもできますが、
cp -r {コピー元のディレクトリ名} {コピーしたもののディレクトリ名}
というコマンドを使うことを考えてみましょう。
また、↑ を使うと前回使ったコマンドを呼び出すことができますので、それを利用した入力を試してみましょう。
練習の答え
cd ~/workspace/tmp/
mkdir a
mkdir a/a
mkdir a/b
mkdir a/c
cp -r a b
find
となります。find コマンドを入力して、正しく作成されているかの確認も行いましょう。
このような複雑なディレクトリ作成をする場合は、マウスで行うよりもコマンドでやったほうが安全、かつ速く行うことができます。