Yanonoblog!

こつこつと

ファイル操作コマンド、シンボリックリンクについてまとめてみる

はじめに

多少実践的にもLinux使えるようになりたいと思い書籍「新しいLinuxの教科書」を読み進めています。

本記事では「新しいLinuxの教科書」で学んだ内容と別途気になって調べた内容や知識も含めアウトプットしていきます。

前回の記事の続きとなっております。

Linuxのファイルとディレクトリの概要 & 関連コマンド

mkdirコマンド

「mkdir」コマンドは、新しいディレクトリ(フォルダ)を作成するために使用されるLinuxコマンドです。

以下はmy_learnというディレクトリを作成しています。

~/w/runteq ❯❯❯ mkdir my_learn
~/w/runteq ❯❯❯ ls -F
2106_yanokohei_runteq_curriculum_advanced/ kiso/                                     spec/
3687_yanokohei_runteq_curriculum_vue/      my_learn/

ちなみにlsコマンドの-Fオプションはファイル種別を付加表示することができるオプションです。

また、同階層に同名のディレクトリは作れません。

一気に深いディレクトリを作成することもできる

以下はディレクトリを3階層分作成している例です。

~/w/runteq ❯❯❯ mkdir javascript/es6/modules

touchコマンド

touchコマンドは、新しい空のファイルを作成したり、既存のファイルの日時情報を更新することができるLinuxコマンドです。

先ほどのディレクトリの最下層にjsファイルを作成する例です。

~/w/runteq ❯❯❯ mkdir javascript/es6/modules
# touchで作成
~/w/runteq ❯❯❯ touch javascript/es6/modules/yano.js

# lsでyano.jsファイルが作成されて存在することを確認
~/w/runteq ❯❯❯ ls javascript/es6/modules
yano.js

rmコマンド

rmコマンドは、指定されたファイルやディレクトリを削除するLinuxコマンドです。以下は、基本的な使い方です。

ファイルを削除する場合:
~/w/runteq ❯❯❯ rm ファイル名
ディレクトリを削除する場合:

ディレクトリを削除する場合はrオプションを付ける必要があります。

~/w/runteq ❯❯❯ rm -r ディレクトリ名
複数のファイルを削除する場合

ファイル名を複数指定して一度に削除することも可能です。

以下は3つのファイルを指定して削除する例です。

~/w/runteq ❯❯❯ rm file1 file2 file3

rmコマンドは、削除するコマンドのため誤って重要なディレクトリやファイルを削除してしまわないように注意して使用する必要があります。

GUIの場合はゴミ箱に移動するため復元することができますが、コマンドでの実行の場合はそのまま抹消されてしまいます。

以下は実際に削除する例です。実際は都度確認が行われるためyesと入力して削除するようです。(実行環境によるかも)

# rm -rでディレクトリ削除
~/w/runteq ❯❯❯ rm -r ruby
# 確認は都度行われるためyesと入力
examine files in directory ruby? yes
examine files in directory ruby/rails? yes
remove ruby/rails? yes
remove ruby? yes

# 削除できたことを確認
~/w/runteq ❯❯❯ ls ruby                                                                                                                       
ls: ruby: No such file or directory

rmdirコマンド

空のディレクトリを削除するために使用されるLinuxコマンドです。

ディレクトリ内にファイルやサブディレクトリが存在する場合、削除が失敗します。

用途としてはrmdirコマンドは中にファイルが存在していることに気が付かずにディレクトリを誤って削除してしまうような事故を防ぐというメリットがあります。

ただ単にディレクトリを消したい場合であれば、rmコマンドの-rオプションを使用すると良いでしょう。

catコマンド

catコマンドは、ファイルの内容をターミナル上に表示するためのLinuxコマンドです。コマンド名の "cat" は "concatenate"(連結)が由来になっているそうです。

ターミナルで cat ファイル名 と入力すると、指定したファイルの内容が表示されます。複数のファイルを指定した場合、順番に表示されます。

以下は先ほど作成したyano.jsに一行の式を追加し、catコマンドでyano.jsの中身を確認する例です。

~/w/runteq ❯❯❯ echo const yano = "yanoyano" >> javascript/es6/modules/yano.js
~/w/runteq ❯❯❯ cat javascript/es6/modules/yano.js
const yano = yanoyano
cat -nオプション

-nオプションを使用すると行の番号が表示されます。

~/w/runteq ❯❯❯ echo const yano = "yunoyuno" >> javascript/es6/modules/yano.js
~/w/runteq ❯❯❯ cat -n javascript/es6/modules/yano.js
     1 const yano = yanoyano
     2 const yano = yunoyuno

lessコマンド

lessコマンドは、LinuxUnixシステムで使用されるテキストファイルのページャーです。

ページャーとは、大きなテキストファイルをページ単位で表示するためのプログラムで大きなファイルを開くときに便利です。

スクロールや検索、テキストの検索するための便利な機能も備えています。

以下のように使用します。

~/w/runteq ❯❯❯ less -n  event/rails_sample/Gemfile.lock
GEM
  remote: https://rubygems.org/
  specs:
    actioncable (6.1.3.1)
      actionpack (= 6.1.3.1)
      activesupport (= 6.1.3.1)
      nio4r (~> 2.0)
      websocket-driver (>= 0.6.1)
    actionmailbox (6.1.3.1)
      actionpack (= 6.1.3.1)
      activejob (= 6.1.3.1)
      activerecord (= 6.1.3.1)
      activestorage (= 6.1.3.1)
      activesupport (= 6.1.3.1)
      mail (>= 2.7.1)
    actionmailer (6.1.3.1)
...
lessコマンド実行途中に便利なコマンド

以下に加えてLinuxでお馴染みのCtrlキーのカーソル操作も可能です。

検索や移動コマンドは使いこなせるようになっておきましょう。

コマンド 解説
j or ↓ 下に1行スクロールする
k or ↑ 上に1行スクロールする
d or PgDn 下に半画面スクロールする
u or PgUp 上に半画面スクロールする
f or → 下に1画面スクロールする
b or ← 上に1画面スクロールする
g or < ファイルの先頭に移動する
G or > ファイルの最後に移動する
/word "word"を検索する(下方向へ)
?word "word"を検索する(上方向へ)
n 前回の検索を下方向へ繰り返す
N 前回の検索を上方向へ繰り返す
q lessコマンドを終了する

cpコマンド

cpコマンドは、ファイルまたはディレクトリをコピーするために使用されます。

cp [オプション] コピー元ファイル名 コピー先ファイル名

チーム開発でよく使われますね。初期設定ファイルとして置いておきdatabase.yml.defaultを各開発者がコピーしてconfig/database.ymlを作成しローカル開発用に使用します。

$ cp config/database.yml.default config/database.yml

[オプション]は、cpコマンドに対して特定の動作を指示するために使用される追加の引数であり、省略可能です。

ディレクトリを指定してコピー

以下はnew.jsファイルをjavascript/es6/modulesディレクトリにコピーは配置する例です。

~/w/runteq ❯❯❯ touch new.js
~/w/runteq ❯❯❯ cp new.js javascript/es6/modules
~/w/runteq ❯❯❯ ls javascript/es6/modules/
 -- file --
new.js   yano.js
既存のファイル名を指定すると上書きとなる

以下はnew.jsファイルをyano.jsとしてコピーする例です。

ただしyano.jsは既存で存在するため、その場合はnew.jsの内容をyano.jsに上書きします。

~/w/runteq ❯❯❯ cp javascript/es6/modules/new.js javascript/es6/modules/yano.js
overwrite javascript/es6/modules/yano.js? (y/n [n]) yes
~/w/runteq ❯❯❯ cat javascript/es6/modules/yano.js

mvコマンド

ファイルやディレクトリを移動するために使用されます。

mv [オプション] 移動元のファイルまたはディレクトリ名 移動先のファイルまたはディレクトリ名

以下はnew.jsファイルをjavascriptディレクトリに移動させている例です。

~/w/runteq ❯❯❯ mv new.js javascript

~/w/runteq ❯❯❯ ls ja
~/w/runteq ❯❯❯ ls javascript/                                                                                                                
 -- file --
es6/    new.js
ファイル名の変更にも使える

移動先のファイル名を存在しない新しいファイル名にするとファイル名が変更されることがわかります。

~/w/runteq ❯❯❯ mv javascript/new.js javascript/new_new_.js   
                                                                                
~/w/runteq ❯❯❯ ls javascript/
 -- file --
es6/         new_new_.js

Inコマンド

リンクを貼るコマンドです。LNはlinkの略です。(多分)

Linuxファイルシステムでは、ファイルに別名をつけることができます。

以下はhoge.txtへのリンク名fugaを作成している例です。

~/w/runteq ❯❯❯ cat other/hoge.txt
テキストです

# ハードリンク(fuga)を作成
~/w/runteq ❯❯❯ ln other/hoge.txt fuga                                                                                                      

# コピー元のファイルを参照する
~/w/runteq ❯❯❯ cat fuga
テキストです

ハードリンク

ハードリンクとは、1つのファイルの実態に複数の名前をつける機能です。

簡単にいうと「参照とコピー」です。

コピー元を編集したらハードリンクの場合はリンク先にも反映されることがわかります。

# コピー元を編集
~/w/runteq ❯❯❯ echo (追加)テキストです >> other/hoge.txt

# リンク先にも反映される
~/w/runteq ❯❯❯ cat fuga
テキストです
(追加)テキストです

ハードリンクは本体を削除してもデータの参照は残る

ハードリンクを持つファイルの実態は、全てのハードリンクが削除されたときに削除されます。

本体が死んだあとも影分身がこの世に残っているような状態ですね。

# コピー元を削除
~/w/runteq ❯❯❯ rm other/hoge.txt
remove other/hoge.txt? yes

# コピー元は消えてもリンク先は残る
~/w/runteq ❯❯❯ cat fuga
テキストです
(追加)テキストです

シンボリックリンク

シンボリックリンクとはリンク先のパス名が書かれた小さな特殊ファイルです。

ハードリンクは影分身と表現しましたが、シンボリックリンクはファイルの実態であり、本物のファイルです。

体の部位を自在に咲かせることができるが、本体へのダメージがダイレクトに能力にも反映されるロビンの能力みたいですね。

# コピー元
~/w/runteq ❯❯❯ cat other/nico_robin.txt
ひどい事するわ...

# -sオプションでシンボリックリンク(hanahana)を作成
~/w/runteq ❯❯❯ ln -s other/nico_robin.txt hanahana

# hanahanaにアクセスすると本体にアクセスできる
~/w/runteq ❯❯❯ cat hanahana
ひどい事するわ...

シンボリックリンクは本体へのパスのファイルのため当然、本体の内容が変わるとリンボリックリンクで参照した際も変化が確認できます。

~/w/runteq ❯❯❯ echo ひどい事するわ...(2回目) >> other/nico_robin.txt

~/w/runteq ❯❯❯ cat hanahana
ひどい事するわ...
ひどい事するわ...(2回目)

シンボリックリンクは本体を削除するとデータの参照が壊れる

本体を削除するとコピーは壊れます。Linux上ではエラーが確認できます。 lsだと色が変わってhanahanaが表示されていました。

~/w/runteq ❯❯❯ rm other/nico_robin.txt
remove other/nico_robin.txt? yes

~/w/runteq ❯❯❯ cat hanahana
cat: hanahana: No such file or directory

GUIだとこのようになります!参照が見つからない。とエラーが表示されていますね。

image

シンボリックリンクの活用方法

ファイルやディレクトリの長いパスを短縮する

長いパス名をシンボリックリンクとして短い名前で置き換えることができます。

~/w/runteq ❯❯❯ ln -s local/work/code/project/source source
~/w/runteq ❯❯❯ cd source

バージョン管理されたファイルを管理する

ファイルのバージョン管理が容易になります。

新しいバージョンのファイルを作成してシンボリックリンクで置き換えることで、古いバージョンのファイルを保持しながら新しいファイルを利用できます。

続く…

コメント

本記事の内容は以上になります!

書籍の続きのアウトプットも随時更新したいと思います。


プログラミングスクールのご紹介 (卒業生より)**

お世話になったプログラミングスクールであるRUNTEQです♪

https://runteq.jp/r/ohtFwbjW

ご不明な点ありましたらお気軽にコメントか、TwitterのDMでお答えします♪

https://twitter.com/outputky

参考

  • 新しいLinuxの教科書 - Chapter05