方言を話すおしゃべり猫型ロボット『ミーア』をリリースしました(こちらをクリック)

【Linux】ls, cp, mv, rm, pwd, cd, mkdir, rmdir, cat, find, which, grep, touch, head, tail, diff, vi, chmod

この記事は約14分で読めます。

基本的なコマンド

ls:ファイルやディレクトリの参照。list

ShellScript
ls [オプション] [ファイル]

# ls コマンドの結果から絞り込む場合:*と?の2種類使える
ls *.conf 
ls ???.conf #?:ファイル名の文字数がわかっている場合(この例だと3文字)

ls hosts.* # hosts. のあとに何らかの名前のつくファイルを絞り込み

# オプション。オプションは-laのように組み合わせることもできる
-a:.(ドット)で始まる隠しファイル等もすべて (All) 出力
-l:長 (Long) 形式で出力。
-t:最終更新時間 (Time) によって、ソートして出力。
-r:逆順 更新時間の逆順 (Reverse) にソートをして出力。

-l(long)オプションをつけると、下記の追加情報が表示される

  1. ファイルタイプとパーミッション: ファイルタイプを示す1文字(通常は - で通常のファイル、d でディレクトリ)と、所有者、グループ、その他のユーザーの権限を示す9文字の文字列(例: -rw-r--r--)。
  2. ハードリンクの数: ファイルまたはディレクトリへのハードリンクの数。同じ内容を持つファイルまたはディレクトリに対して、ハードリンクの数だけけ、異なるパスや名前が存在することを指す。
  3. 所有者の名前: ファイルまたはディレクトリの所有者のユーザー名。
  4. グループ名: ファイルまたはディレクトリの所有者のグループ名。
  5. ファイルサイズ: バイト単位でのファイルサイズ。
  6. 最終変更日時: ファイルまたはディレクトリの最後に変更された日時。
  7. ファイル名: ファイルまたはディレクトリの名前。
ShellScript
# この出力では、file.txt が普通のファイルであること、所有者(user)には読み書き権限があり、そのグループ(group)とその他のユーザーには読み取り権限があること、1つのハードリンクが存在すること、ファイルサイズが4096バイトであること、そして最終変更日時が3月10日の10時00分であることがわかる。
-rw-r--r-- 1 user group 4096 Mar 10 10:00 file.txt

ハードリンクとシンボリックリンクの違いは、下記記事がわかりやすい

https://www2.it-shikaku.jp/top30.php?hidari=1_02_3.php&migi=km1_02.php&title=1.02.3%20%E3%83%8F%E3%83%BC%E3%83%89%E3%83%AA%E3%83%B3%E3%82%AF%E3%81%A8%E3%82%B7%E3%83%B3%E3%83%9C%E3%83%AA%E3%83%83%E3%82%AF%E3%83%AA%E3%83%B3%E3%82%AF

cp:ファイルのコピー。copy

コピーや移動など、対象となるファイルと、目的先のファイルやディレクトリが必要な場合は、「コマンド 対象元 対象先」の順になる。

ShellScript
cp [オプション] コピー元 コピー先

$ cp src-file dst-file
# dst-fileが、存在しないファイル名の場合:ファイルを別名のファイルとしてコピー
# dst-file が存在するファイル名の場合:ファイル dst-file はファイル src-file のコピーで上書きされる。
# dst-fileが、ディレクトリ名の場合:dst-file の下にファイルsrc-fileのコピーが作成される

mv:ファイルの移動。move

  • mv コマンドでファイルやディレクトリを移動、または名前を変更。
ShellScript
mv 移動元ファイル/ディレクトリ 移動先ファイル/ディレクトリ

# 移動先のファイル/ディレクトリが存在しない場合は、移動元のファイル/ディレクトリにファイル名/ディレクトリ名が変更される

rm:ファイルの削除。remove

  • rm コマンドでファイルを削除。
  • ディレクトリを削除するには r オプションが必要。-r は recursive(再帰)を示すオプションで、「ディレクトリの中のディ レクトリの中の・・・」という階層構造の中の中までを意味する
ShellScript
rm ファイル名
rm -r ディレクトリ名

# オプション
-f:強制処理
-r:ディレクトリを対象にする。ディレクトリの中の、ファイルやディレクトリも削除する

pwd:現在のディレクトリの表示。print working directory

ShellScript
$ pwd 
/home/penguin

cd:ディレクトリの変更。change directory

ShellScript
cd [ディレクトリ名]

mkdir:ディレクトリの作成。make directory

何もオプションをつけずにデフォルトの場合には、一階層分のディレクトリしか作成できない。
mkdir単体だと、ディレクトリを作るときはその上位層ができていないと作成できない、という制約があるため。

しかし、-pオプションをつけると、指定されたディレクトリを作成するだけでなく、そのディレクトリの上位ディレクトリも必要に応じて作成できる。階層的なディレクトリ構造を持つディレクトリを作成する場合に便利。

ShellScript
# オプション
# -p:指定されたディレクトリの上位ディレクトリも作成する

# オプションをつけないと、mkdirコマンドを毎回実行しないと下位のディレクトリを作成できない
# mkdir単体だと、ディレクトリを作るときはその上位層ができていないと作成できない、という制約があるため
$ mkdir dir1
$ mkdir dir1/dir2
$ mkdir dir1/dir2/dir3

# -p オプションを付けて実行すると、一度で可能
$ mkdir -p dir1/dir2/dir3

rmdir:ディレクトリの削除。remove directory

  • rmdir コマンド:「中身が空の時のみ」ディレクトリを削除できる。
  • 中身のあるディレクトリを削除するには rm -r を使用。
  • ディレクトリ関連の操作の時は、dirをつける(rm→rmdir)
ShellScript
# dict1/dict2 ディレクトリを一括で削除 
$ rmdir -p dict1/dict2

特別なディレクトリ

  • . :現在のディレクトリ
  • .. :親ディレクトリ
  • ~ :ホームディレクトリ。ユーザの作業開始位置となるディレクトリ
    • 一意的な場所であり、通常はユーザー名と関連付けられたディレクトリ
    • ユーザー”john”のホームディレクトリは通常”/home/john”や”/Users/john”のようになる。新しいユーザーが作成されると、彼らのホームディレクトリもそれぞれのユーザー名に基づいて作成される。
  • / : ルートディレクトリ。ディレクトリ階層の、最上位階層

cat:ファイルの内容を表示。concatenate(連結させる)

ShellScript
# オプション -n:行番号表示
cat -n ~/.bashrc

# ページャーを使ったファイルの内容表示
more ファイル名
less ファイル名

find:ファイル検索

ShellScript
find パス -name ファイル名

 ~ find /etc/ -name hosts                                                                                                                                                                                                             
/etc//hosts
find: /etc//cups/certs: Permission denied

which:コマンドのパスを表示

ShellScript
which コマンド名
 ~ which cat                                                                                                                                                                                                                          
/bin/cat

grep:ファイルの中からデータを検索。 Global Regular Expression Print

  • | grepで、標準入力から入ったデータに対し検索を行なうことも可能
ShellScript
grep [オプション] 検索条件 [指定ファイル]

 ~ grep abc /etc/*                                                                                                                                                                                                                    
grep: /etc/aliases.db: Permission denied
grep: /etc/apache2: Is a directory

# filename.txtからデータを読み取り、その中で"pattern"という文字列を検索
# catコマンドはファイルの内容をコマンドライン上に表示するため、grepコマンドで検索できる。
cat filename.txt | grep "pattern"

# オプション
# -e:文字列を検索パターンとして扱う
# ファイル名が d で終わるファイルを/usr/bin から検索。
 ~ ls /usr/bin/ | grep -e d$                                                                                                                                                                                                          
afscexpand
bitesize.d

touch:ファイルのタイムスタンプの変更・空のファイル作成

ファイルには、タイムスタンプ(最終更新日)が必ず存在する。

タイムスタンプは ls コマンド の-l オプションを付けることで確認できる。

touchコマンドでファイルの最終更新時間を現在日時に変更する。

ShellScript
$ ls -l hosts.bak
-rw-rw-r-- 1 okada okada 187 Jun 4 10:06 hosts.bak
$ touch hosts.bak
$ ls -l hosts.bak
-rw-rw-r-- 1 okada okada 187 Jun 5 09:50 hosts.bak

head, tail:ファイルの一部取得

ShellScript
head [オプション] ファイル名
tail [オプション] ファイル名

#オプション
-n 行:先頭/末尾から指定した行を標準出力。何も指定しないと先頭/末尾から10行を表示
-c バイト:先頭/末尾から指定したバイト分を標準出力

$ head -n 5 worker.go # 先頭の5行だけ出力
package clocky_be

import (
        "log"
        "time"

tail -f [ファイル名]
# -f:変更をリアルタイムでモニタする。followの略

diff:ファイルの比較

ShellScript
diff [オプション] ファイル 1 ファイル 2

#オプション
-u:unified diff 形式で差分を出力
$ diff -u file1 file2
--- file1 2012-07-06 13:21:21.219249366 +0900
+++ file2 2012-07-06 13:26:51.664814277 +0900 @@ -1 +1,2 @@
-test text
+overwrite text
+new line

Viエディタ

:q! ファイルを保存せずに強制的に閉じる

通常、編集済みのファイルはそのままでは(:qコマンドでは)閉じることができない。:q コマンドのあと に!をつけることで、ファイルを保存せずに強制的に終了できる。

コマンドモード→インサートモードに切り替える。i/I/a/A

ShellScript
i:カーソルがある位置 (文字の前) にテキストを入力。insertの略
I:行頭にテキストを入力
a:カーソルのある文字の 後にテキストを入力。appendの略
A:行の最後にテキスト入力
ESCキー:インサートモードからコマンドモードに切り替える

カーソルの移動:h/l/k/j

ShellScript
h:左
l:右
k:上
j:下

0 : 現在の行の先頭に移動します。
^ : 現在の行の最初の非空白文字に移動します。
$ : 現在の行の末尾に移動します。
G : ファイルの最後に移動します。
gg : ファイルの最初に移動します。
{ : 前の段落の始まりに移動します。
} : 次の段落の始まりに移動します。

:10:10行目へ移動

文字のカット・ペースト:x/dd/yy/p/u

ShellScript
x:一文字削除
dd:1行削除
yy:1行コピー
p:カーソルの文字の次、または次の行にペースト(paste)
u:編集の取り消し(undo)

置換と検索:n/N/s

ShellScript
/検索文字列 :文字列の検索
n:下方向へ再検索
N:上方向へ再検索

# sはsubsitute(置換)の略
:対象の行 s/検索文字列/置換文字列/オプション

# 1行目のorangeをORANGEに置換する
:1s/orange/ORANGE/

# オプションにgを指定すると1行にある複数(ファイル全体)の検索文字列を置換
:%s/old/new/g

ファイルとアクセス権

ファイルのアクセス権表示:rwx

ファイルの種別

ShellScript
「d」:ディレクトリ
「-」: 通常のファイルを示します。
「l」: シンボリックリンクを示します。
「s」: ソケットファイルを示します。
「p」: 名前付きパイプ(FIFO)を示します。
「c」: キャラクタデバイスファイルを示します。
「b」: ブロックデバイスファイルを示します。
ShellScript
 ~ ls -l ~/.zshrc                                                                                                                                          
-rw-r--r--@ 1 ky  staff  3748  3  4 16:12 /Users/ky/.zshrc

# 上記の例の場合のファイルアクセス権限
# 所有者(u:user):読み書き
# 所有グループ(g:group):読み
# その他(o:others):読み
# r:読み込み。readの略
# w:書き込み。writeの略
# x:実行またはディレクトリの移動。何かの略語ではない。

chmod:ファイルのアクセス権を変更。change modeの略

パーミッション:

  • ファイルのパーミッションは、所有者、所有者のグループ、他のユーザーに対する読み取り、書き込み、実行の権限を指定する。
  • パーミッションは3桁の数字で表され、各桁は所有者、グループ、他のユーザーの権限を表す。各桁はそれぞれ読み取り(4)、書き込み(2)、実行(1)の値を持ち、これらの値を組み合わせて権限を指定する。
  • 8進数で指定する。たとえば、読み取りと実行の権限が必要な場合は5、すべての権限が必要な場合は7となる。

オプション:

  • R:再帰的にディレクトリとその中のファイルの権限を変更。
  • v:変更を詳細に表示する
  • f:エラーメッセージを表示しないようにする。

よく使われる設定

chmod 755 file.txt

  • 所有者(u)には読み(r)、書き(w)、実行(x)の権限(7)が与えられ、所有者のグループ(g)と他のユーザー(o)には読み(r)と実行(x)の権限(5)が与えられるる。
  • 実行可能なファイル(例:app, server)やスクリプト(例:deploy.sh, backup.sh), ディレクトリ(例: /usr/local/bin)にこのパーミッションを設定することが多い。

chmod 644 file.txt

  • 所有者には読み(r)と書き(w)の権限(6)があり、グループと他のユーザーには読み(r)の権限(4)が与えられるる。
  • 一般的なドキュメントやテキストファイルに適している。テキストファイルは実行する必要がないため、実行権限は通常与えられない。実行権限を無闇にファイルに与えるとセキュリティ上のリスクを生じさせることがある。

chmod 700 file.txt

  • 所有者には読み(r)、書き(w)、実行(x)の全権限(7)が与えられ、他のどのユーザーにも権限(0)が与えられない。
  • 所有者だけがアクセスを制御すべきファイルやディレクトリに使用される。
    • 個人的なデータファイル: 秘密のキー、設定ファイル、またはその他の機密情報を含むファイル。例: id_rsa, config.ini
    • 一時ファイル: システムプロセスまたはアプリケーションによって生成されるが、所有者のみが読み書きすべき一時ファイルやソケットファイル。例: session.sock, tmp/cache

コメント

タイトルとURLをコピーしました