ファイル操作

この教材は2016年版度の教材です
最新の状況が反映されているのは 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 によってはこのディレクトリのことをフォルダと呼ぶことがあります。

写真:Windows のフォルダ

ファイルとディレクトリをコマンドで扱ってみよう

Linux でディレクトリを扱うために、 8 つのコマンドを紹介します。

コマンド できる操作
pwd 現在のディレクトリの表示
ls ファイル・ディレクトリの一覧の表示
cd 現在のディレクトリの変更
mkdir ディレクトリの作成
rm ファイルやディレクトリの削除
cp ファイルやディレクトリのコピー
mv ファイルやディレクトリの移動
find ファイル・ディレクトリの検索

多いですが、必要になった時に調べながら使って行くことができれば十分です。
「linux コマンド コピー」などと検索サイトで検索しても、必要な cp コマンドを見つけることができるでしょう。

それでは、ひとつずつ使い方を見ていきましょう。

まずは vagrant を立ち上げます。


Windows では、コマンドプロンプトより以下を入力します。

cd %USERPROFILE%\vagrant\ubuntu64
vagrant up

RLogin を起動し、 vagrant と書いてある行をダブルクリックします。

RLogin の設定を確認する


Mac では、「ターミナル.app」へ、以下を入力します。

cd  ~/vagrant/ubuntu64
vagrant up
vagrant ssh

pwd コマンド

pwd は、Print Working Directory の略称で、このコマンドが実行された時点での、現在のディレクトリを表示してくれます。
現在いるディレクトリは英語で Current Directory と書くことから、カレントディレクトリとも呼びます。

写真:pwd のイメージ
pwd

と入力すると

/home/vagrant

と表示されるのではないでしょうか。これが現在のディレクトリです。
最上位からみて、 home というディレクトリ内の vagrant の中にいる、ということを示しています。
なお最上位のディレクトリは、 / と表し、ルートディレクトリと呼びます。
また、/ でつながれたディレクトリの位置を表す文字列をパスと呼びます。

パスの書き方には、

  • 絶対パス: ルートディレクトリからのパス
  • 相対パス: 現在のディレクトリ(カレントディレクトリ)からのパス

という 2 つの書き方があり、例えば、現在のディレクトリ(カレントディレクトリ)が /home の時、絶対パス /home/vagrant を相対パスで表すと、./vagrant となります。
また、 ./ を省いて vagrant と書くこともできます。


ls コマンド

ls は LiSt の略から名付けられたコマンドで、現在のディレクトリにあるファイルとディレクトリの一覧を表示してくれます。

写真:ls のイメージ
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 のイメージ
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 のイメージ
mkdir workspace
mkdir tmp
ls

と入力すると

tmp workspace

と表示されるのではないでしょうか。

tmp という一時ディレクトリと workspace という作業用ディレクトリが作成できました。
なお tmp は temporary の略称でよく使われる書き方です。


rm コマンド

rm は、ReMove の略から名付けられたコマンドで、ディレクトリやファイルを削除します。第一引数に削除するディレクトリまたはファイル名を記述して使います。

写真:rm のイメージ
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 の略から名付けられたコマンドで、ファイルやディレクトリをコピーすることができます。
第一引数にコピー元のファイルやディレクトリ名を、 第二引数にコピー先のファイルやディレクトリ名を記述します。

写真:cp のイメージ
cd ~
cp -r tmp workspace

上記のコマンドは、tmp ディレクトリを workspace の中にコピーするというものです。
-r はディレクトリの中身も含めて、再帰的にコピーするというオプションです。
tmp ディレクトリの中には b というディレクトリがあるので、それも一緒にコピーしてしまいます。

cd workspace
ls

これで、workspace 内にも tmp ディレクトリができていることがわかります。

tmp

mv コマンド

mv は、MoVe の略称で、 ファイルやディレクトリを移動します。名前を変更するのにも使います。
第一引数に移動するファイルやディレクトリ名を、 第二引数に移動先のディレクトリか、変更するディレクトリ名、またはファイル名を記述します。

写真:mv のイメージ
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 がそのままコマンド名になっていて、ファイルを探すことができます。

写真: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 はファイルを探すのに非常に便利です。

Tips man コマンドを使ってみよう

コマンドの使い方を知るためのコマンドに man コマンドというコマンドがあります。
man コマンドの使い方を見てみましょう。

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 {コピー元のディレクトリ名} {コピーしたもののディレクトリ名}

というコマンドを使うことを考えてみましょう。
また、 を使うと前回使ったコマンドを呼び出すことができますので、それを利用した入力を試してみましょう。

解いてみたので、答えを表示する