Yuki's Tech Blog

仕事で得た知見や勉強した技術を書きます。

【もう絶対に忘れない Linux コマンド【Linux 100本ノック+名前の由来+丁寧な解説で、長期記憶に焼き付けろ!】セクション4: ファイル操作で知らなかったことをざっくりまとめてみた

目次

mkdirコマンド

mkdirコマンドを実行することで、 新しい空のディレクトリを作成することができます。

[ec2-user@ip-10-0-10-10 ~]$ mkdir repos
[ec2-user@ip-10-0-10-10 ~]$ ls
latest-ja.tar.gz  repos  wordpress

mkdirコマンドは複数階層からなるディレクトリの作成には対応していません。

[ec2-user@ip-10-0-10-10 repos]$ mkdir rails/rails-practice
mkdir: cannot create directory ‘rails/rails-practice’: No such file or directory

複数階層からなるディレクトリを作成したい場合、-p オプションを指定します。 pはparents(親)の意味です。つまり、親ディレクトリもまとめてディレクトリを作成するという意味になります。

[ec2-user@ip-10-0-10-10 repos]$ mkdir rails/rails-practice
mkdir: cannot create directory ‘rails/rails-practice’: No such file or directory
[ec2-user@ip-10-0-10-10 repos]$ mkdir -p rails/rails-practice
[ec2-user@ip-10-0-10-10 repos]$ ls
rails
[ec2-user@ip-10-0-10-10 repos]$ cd rails
[ec2-user@ip-10-0-10-10 rails]$ ls
rails-practice
[ec2-user@ip-10-0-10-10 rails]$ 

touchコマンド

touchコマンドを実行することで、カレントディレクトリ配下に新しいファイルを作成することができます。

touch 新規作成するファイル名 or パス

ファイルやディレクトリを削除するコマンド

rmコマンド

rmコマンドでファイルを削除することができます。

rm ファイル名 or パス

rmdirコマンド

rmdirコマンドで 空のディレクトリを削除することができます。

rmdir ディレクトリ名 or パス

空ではないディレクトリを指定するとエラーが起きます。

[ec2-user@ip-10-0-10-10 rails]$ rmdir rails-practice/
rmdir: failed to remove ‘rails-practice/’: Directory not empty
[ec2-user@ip-10-0-10-10 rails]$ 

空ではないディレクトリを削除したい場合、rmコマンドに-rオプションを指定して実行します。 -rはリカーシブ(再帰的な)という意味で、中に入っているファイルやディレクトリも再帰的にまとめて削除します。

[ec2-user@ip-10-0-10-10 rails]$ rm -r rails-practice
[ec2-user@ip-10-0-10-10 rails]$ ls
[ec2-user@ip-10-0-10-10 rails]$ 

catコマンド

catコマンドを実行することで、ファイルの中身を確認できます。ちなみにlessを使うと、スクロール表示させることができます。

テキストファイルとバイナリファイル

Linuxには大きく分けて、2種類のファイルがあります。一つがテキストファイル(人間が読めて編集できるファイル)です。もう一つがバイナリファイル(2進数で書かれているファイル)です。 テキストファイルをコンピュータで実行する場合、バイナリファイルに変換してから実行する必要があるので、実行速度が遅いです。人間がそのファイルを編集しないなら、最初からバイナリファイルで用意しておく方が、早く実行することができます。

cpコマンド

cpコマンドを実行することで、 ファイルやディレクトリをコピーすることができます。 cpはコピーの略です。最初にコピーしたいファイル名を指定して、2番目にどういう名前でコピーするかを指定します。コピーするだけなので、元のファイルやディレクトリは削除されたしません。

cp ファイル名 or パス ファイル名 or パス
[ec2-user@ip-10-0-10-10 repos]$ ls
rails  react
[ec2-user@ip-10-0-10-10 repos]$ ls react
react-practice
[ec2-user@ip-10-0-10-10 repos]$ cp rails/rails-practice/sample.rb react/react-practice/react-sample.rb
[ec2-user@ip-10-0-10-10 repos]$ ls react/react-practice/
react-sample.rb
[ec2-user@ip-10-0-10-10 repos]$ ls rails/rails-practice/
sample.rb

あるディレクトリを別のディレクトリ配下にコピーするのもcpコマンドでできます。その場合、-r オプションをつけます(再帰的)。第二引数はどういう名前でコピーするかを指定するので、気をつけましょう。

[ec2-user@ip-10-0-10-10 react-1]$ cp -r ~/repos/rails rails
[ec2-user@ip-10-0-10-10 react-1]$ ls
rails

(注)cpコマンドの第二引数にディレクトリ名を指定する際に、カレントディレクトリ配下に存在するディレクトリ名を指定すると、カレントディレクトリにディレクトリがコピーされず、同名のディレクトリ配下に元々の名前でディレクトリがコピーされます(ディレクトリの一意性を守るため)。カレントディレクトリには存在しないディレクトリ名でcpコマンドを実行する場合、指定したディレクトリ名でカレントディレクトリ配下にコピーされます。

mvコマンド

mvコマンドを実行することで、 ファイル名を変更したり、ファイルを移動させたりできます。 第一引数には対象のファイル、第二引数には命名したいファイル名 or パスを指定します。mvはmoveの略です。

mv ファイル名 or パス ファイル名 or パス
[ec2-user@ip-10-0-10-10 react]$ ls ../rails/rails-practice/
sample.rb
[ec2-user@ip-10-0-10-10 react]$ mv ../rails/rails-practice/sample.rb ../rails/rails-practice/sample5.rb
[ec2-user@ip-10-0-10-10 react]$ ls
[ec2-user@ip-10-0-10-10 react]$ ls ../rails/rails-practice/
sample5.rb
[ec2-user@ip-10-0-10-10 react]$ 

第二引数の部分にディレクトリを指定すると、そこにファイルが移動します。cpコマンドと違ってmvコマンドの場合、本当にファイルが移動します。

[ec2-user@ip-10-0-10-10 react]$ mv ../rails/rails-practice/sample.rb ./
[ec2-user@ip-10-0-10-10 react]$ ls
sample.rb
[ec2-user@ip-10-0-10-10 react]$ ls ../rails/rails-practice/sample.rb 
ls: cannot access ../rails/rails-practice/sample.rb: No such file or directory
[ec2-user@ip-10-0-10-10 react]$ ls ../rails/rails-practice/ 
[ec2-user@ip-10-0-10-10 react]$ 

(注) mvコマンドには-rオプションは指定しなくて大丈夫です。

パス名展開

パス名展開を使うことで、文字列をパターンで表現することができます。

記号 意味
*(アスタリスク 長さ0以上の文字列にマッチします。
? 任意の1文字

??と書くことで任意の2文字を指定できます。

(注)正規表現とは記号の意味が違うので、気をつけましょう。

リンクとは何か

リンクとは、 ファイルに別名をつける機能のことです。リンクを使うことで、ファイルに別名を付けて一つのファイルを複数の名前で呼び出すことができます。

リンクを使うメリット

リンクを使うメリットは、長いパス名を省略できることです。長いパス名を省略することで、ファイルの指定が簡単になります。また、ファイルを移動させたとしても、プログラムを修正する必要がなくなります。

ハードリンクとシンボリックリング

リンクには大きく分けて2種類のリンクがあります。ハードリンクとシンボリックリンクです。

ハードリンク

ハードリンクとは、 名前と実体を結びつける形でファイルに別名をつける機能です。 ざっくりいうと一つのファイルに複数の名前をつける機能です。 ハードリンクはファイルに対して設定できますが、ディレクトリに対しては設定できません。 以下のコマンドでファイルにハードリンクを設定します。lnはLinkの略語です。

ln ハードリンクをつけたいファイル名 ハードリンク名

以下のように実行すると、指定した名前でハードリンクが作成されています。実体は同じファイルです。

[ec2-user@ip-10-0-10-10 repos]$ ls
rails  react  react-1  sample.rb
[ec2-user@ip-10-0-10-10 repos]$ ln sample.rb sample-ruby
[ec2-user@ip-10-0-10-10 repos]$ ls
rails  react  react-1  sample.rb  sample-ruby

ハードリンクを消したい場合、rmコマンドを実行します。 

シンボリックリンク

ハードリンクはディレクトリに対して設定できなかったりして、結構不便です。そのため、実際に使われているリンクはシンボリックリンクです。 シンボリックリンクは、名前と名前を結びつける機能です。 シンボリックリンクによって、元々のファイル名を通じてファイルに別名を付けることができます。シンボリックリンクで指定した名前はファイルの実体とは直接的に紐づいていません。元々のファイル名に日もづけられています。

シンボリックリンクを作成するには、lnコマンドに-sオプションを指定します。sはシンボリックの略です。

ln シンボリックリンクをつけたいファイル名 or パス シンボリックリンク名

ls -Fで確認すると、@がついているものがシンボリックリンクなので、sample-rubyシンボリックリンクであることが分かります。

[ec2-user@ip-10-0-10-10 repos]$ ls
rails  react  react-1  sample.rb
[ec2-user@ip-10-0-10-10 repos]$ ln -s sample.rb sample-ruby
[ec2-user@ip-10-0-10-10 repos]$ ls
rails  react  react-1  sample.rb  sample-ruby
[ec2-user@ip-10-0-10-10 repos]$ ls -F
rails/  react/  react-1/  sample.rb  sample-ruby@
[ec2-user@ip-10-0-10-10 repos]
[ec2-user@ip-10-0-10-10 repos]$ ls -l | grep sample-ruby
lrwxrwxrwx 1 ec2-user ec2-user  9 Nov 11 14:35 sample-ruby -> sample.rb

シンボリックリンクを消したい場合、ハードリンクを削除するときと同じでrmコマンドを実行します。

シンボリックリンクの特徴

  1. ディレクトリに対してもシンボリックリンクを設定できる
  2. 実体がなくてもシンボリックリンクを作成できる。

シンボリックリンクを実際に作ってみる

実際にシンボリックリンクを深い階層のファイルに対して作ってみました。そうすると、カレントディレクトリにシンボリックリンクが作成されました。そのシンボリックリンクvimで開くとsample.rbの内容が表示されたり、catコマンドで指定するとちゃんと中身が表示されたりしました。長いパスを何回も入力してファイルを指定しないといけない場面で、シンボリックリンクを作成すると便利だと感じました。

[ec2-user@ip-10-0-10-10 repos]$ ls
rails  react  react-1  sample.rb
[ec2-user@ip-10-0-10-10 repos]$ ls rails/rails-practice/ruby-practice/sample.rb
rails/rails-practice/ruby-practice/sample.rb
[ec2-user@ip-10-0-10-10 repos]$ ln -s rails/rails-practice/ruby-practice/sample.rb sample-ruby
[ec2-user@ip-10-0-10-10 repos]$ ls
rails  react  react-1  sample.rb  sample-ruby
[ec2-user@ip-10-0-10-10 repos]$ ls sample-ruby
sample-ruby
[ec2-user@ip-10-0-10-10 repos]$ ls -l
total 0
drwxrwxr-x 3 ec2-user ec2-user 28 Nov 11 10:40 rails
drwxrwxr-x 2 ec2-user ec2-user 23 Nov 11 11:28 react
drwxrwxr-x 3 ec2-user ec2-user 19 Nov 11 10:57 react-1
-rw-rw-r-- 1 ec2-user ec2-user  0 Nov 11 14:17 sample.rb
lrwxrwxrwx 1 ec2-user ec2-user 44 Nov 11 14:42 sample-ruby -> rails/rails-practice/ruby-practice/sample.rb
[ec2-user@ip-10-0-10-10 repos]$ cat sample-ruby
[ec2-user@ip-10-0-10-10 repos]$ vim sample-ruby
[ec2-user@ip-10-0-10-10 repos]$ vim rails
[ec2-user@ip-10-0-10-10 repos]$ vim sample-ruby
[ec2-user@ip-10-0-10-10 repos]$ cat sample-ruby
a = 1

puts a

感想

Vimが使えると、ファイルの中身を見たりファイル内検索したりがコマンドを覚えなくてもできるので、やっぱVimって良いなと感じました。

参考記事

もう絶対に忘れない Linux コマンド【Linux 100本ノック+名前の由来+丁寧な解説で、長期記憶に焼き付けろ!】 | Udemy

【 ディレクトリごとコピーする 】 | 日経クロステック(xTECH)