LoginSignup
5

More than 1 year has passed since last update.

posted at

updated at

Linuxコマンド

base64

入力をBASE64でエンコード(デコード)して出力

# ex. test.txt を BASE64 でエンコードし、test_base64.txt へ出力
$ base64 test.txt > test_base64.txt

# デコード時のオプション
base64 -d 【ファイル名】
base64 --decode 【ファイル名】

# ex. BASE64 でエンコードされた test_base64.txt をデコード
$ base64 -d test_base64.txt
これは test_base64.txt をデコードしたファイルの内容です 

basename

ファイルパスからディレクトリ部分を取り除く

basename 【ファイル名】

# ex. /home/user/test.txt からファイル名のみ表示
$ basename /home/user/test.txt
test.txt

ファイル名から拡張子を取り除く

basename 【ファイル名】【拡張子】

# ex. test.txt から .txt を取り除く
$ basename test.txt .txt
test

# ex. ファイルパスから拡張子を取り除いたファイル名のみ表示
$ basename /home/user/test.txt .txt
test

bc

小数点以下のケタ数を指定して計算する

# echo コマンドと組み合わせて実行する
echo "scale = 【小数点以下のケタ数】; 【計算式】" | bc

# ex. 5 ÷ 3 の計算結果を小数点以下2ケタまで表示
$ echo "scale = 2; 5 / 3" | bc
1.66

cat

ファイルの内容を表示

cat 【ファイル名】

# ファイルを連結して表示
cat 【ファイル1】 【ファイル2】

# ex. file1.txt と file2.txt の内容をまとめて、file3.txt へ出力
$ cat file1.txt file2.txt > file3.txt
$ cat file3.txt
file1.txt の内容です
file2.txt の内容です

# 行番号を表示
cat -n 【ファイル名】
cat --number 【ファイル名】

# ex. test.txt の内容を行番号を付けて表示
$ cat -n test.txt
     1  test.txt ファイルの1行目です
     2  test.txt ファイルの2行目です
     3  test.txt ファイルの3行目です

chmod (change mode)

ファイルやディレクトリのアクセス権限を変更

r w x
読み込み可能 書き込み可能 実行可能
# 1) 所有ユーザ, 2) 所有グループ, 3) その他ユーザ, それぞれのアクセス権限
-rwxrwxrwx
  1  2  3

モードビット

r-- -w- --x ---
4 2 1 0
読み込み可能 書き込み可能 実行可能 権限なし

上記の足し算によって権限を組み合わせる

-wx r-x rw- rwx
2 + 1 = 3 4 + 1 = 5 4 + 2 = 6 4 + 2 + 1 = 7
書き込み・実行 読み込み・実行 読み込み・書き込み 読み込み・書き込み・実行
chmod 【アクセス権限】 【ファイル名】

# ex. test.sh に対して、全ユーザに全アクセス権限を設定
$ chmod 777 test.sh
-rwxrwxrwx test.sh

# ex. test.sh に対して、所有ユーザに全アクセス権限、所有グループとその他ユーザに読み込み&実行権限を設定
$ chmod 755 test.sh
-rwxr-xr-x test.sh

# ex. test.sh に対して、所有ユーザに読み込み&書き込み権限を設定(所有グループとその他ユーザは権限なし)
$ chmod 600 test.sh
-rw------- test.sh

chown (change owner)

ファイル所有権やグループ所有権を変更

# ディレクトリ以下も再帰的に所有権を変更
chown -R 【ユーザ】:【グループ名】 【ディレクトリ】

# ex. /home/test 以下の所有権を user へ変更
chown -R user /home/test/
-rwxr-xr-x 1 user user 0 Feb 2 22:01 test

ユーザ名とグループ名の指定方法

指定方法 詳細
ユーザ名:グループ名 指定したユーザ名とグループ名を設定
ユーザ名 対象ファイルの所有ユーザ名のみ変更
ユーザ名: ユーザ名と、ユーザ名と同じグループ名を設定
:グループ名 対象ファイルの所有グループ名のみ変更

clear

画面をクリアにする

clear

キーボードショートカット Ctrl + l でも同様の結果を得られる。

cp

ファイルやディレクトリをコピー

cp 【コピー元ファイル】 【コピー先ファイル】

# カレントディレクトリの file1.txt を file2.txt というファイル名でコピー
cp file1.txt file2.txt

コピー元にディレクトリを指定した場合、再帰的に(サブディレクトリも含めて)コピーする

cp -r 【コピー元ファイル/ディレクトリ】 【コピー先ディレクトリ】
cp --recursive 【コピー元ファイル/ディレクトリ】 【コピー先ディレクトリ】

# ex. folder 配下すべてを folder_copied へディレクトリ構造を含めてコピー
cp -r folder folder_copied

【コピー元ファイル】 を 【コピー先ディレクトリ】 へコピーする

cp 【コピー元ファイル】 -t 【コピー先ディレクトリ】
cp 【コピー元ファイル】 --target-directory= 【コピー先ディレクトリ】

# ex. file.txt をディレクトリ folder_copied へコピー
cp file.txt -t folder_copied

# recursive オプションでコピー元をファイルにした場合と同じ結果になる
cp -r file.txt folder_copied

【コピー元ファイル】 を 【コピー先ディレクトリ】 へディレクトリ構造ごとコピー

cp --parents 【コピー元ファイル】 【コピー先ディレクトリ】

# ex. folder/file.txt をディレクトリ folder_copied/folder へコピー
cp --parents folder/file.txt folder_copied

# recursive オプションでは、コピー元をファイルにした場合、ディレクトリ構造はコピーされない
$ cp -r folder/file.txt folder_copied
$ find ./folder_copied -name 'file.txt'
./folder_copied/file.txt

# parents オプションでは、コピー元をファイルにしてもディレクトリ構造ごとコピーされる
$ cp --parents folder/file.txt folder_copied
$ find ./folder_copied -name 'file.txt'
./folder_copied/folder/file.txt

特定ディレクトリ配下の「特定ファイルのみ」ディレクトリ構造を含めてコピーしたい場合は find, xargs コマンドと組み合わせる

# ex. folder 配下の log ファイルのみ folder_copied へディレクトリ構造を含めてコピー
find ./folder -type f -name '*.log' | xargs cp --parents --target-directory=folder_copied

cut

ファイルの各行から指定した範囲を切り出す

# 【区切り文字】 で区切られたcsvなどの 【ファイル名】 から 【項目数】 の範囲を表示
cut -d 【区切り文字】 -f 【項目数】 【ファイル名】
cut --delimiter= 【区切り文字】 --fields= 【項目数】 【ファイル名】

# ex. test.csv の2列目を表示
$ cut -d "," -f 2 test.csv
test.csv の2列目ヘッダです
test.csv の2列目2行目です
test.csv の2列目3行目です

# 指定した 【文字数】 だけ表示
cut -c 【文字数】
cut --characters= 【文字数】

# ex. test.csv の2列目の14文字目を表示
$ cut -d "," -f 2 test.csv | cut -c 14
ヘ
2
3

# ex. test.csv の2列目の14文字目までを表示
$ cut -d "," -f 2 test.csv | cut -c 1-14
test.csv の2列目ヘ
test.csv の2列目2
test.csv の2列目3

date

日付と時刻の表示

# 現在のローカル日時を表示
$ date
Thu Feb 20 20:05:55 JST 2020

# 現在のローカル日時を yyyy/mm/dd hh:mm:ss 形式で表示
$ date '+%Y/%m/%d %H:%M:%S'
2020/02/20 20:05:55

# 現在ではなく 【日時】 で指定した日時を表示
date -d 【日時】
date --date= 【日時】

# ex. 10日前のローカル日時を表示
$ date -d '10 days ago'
Mon Feb 10 20:05:55 JST 2020

unixtime への変換については unixtime 相互変換 を参照。

echo

任意の1行テキストを表示

# 画面に Hello World と表示する
$ echo 'Hello World'
Hello World

# エスケープ文字を解釈する
$ echo -e '【エスケープ文字を含んだ任意の1行テキスト】'

# ex. 画面に Hello World を改行して表示する
$ echo -e 'Hello\nWorld'
Hello
World

# 出力した任意の1行テキストの最後を改行しない
$ echo -n '【エスケープ文字を含んだ任意の1行テキスト】'

expr

計算式や論理式を評価する

expr 【評価式】

四則演算

# 3 ÷ 2 の結果を返す(小数は切り捨てられる)
$ expr 3 + 2
1

# 3 ÷ 2 の余りを返す
$ expr 3 % 2
1

比較

# x=100 と y=200 は等しくないので、= による比較の場合 0 (=FALSE) を返す
$ x=100; y=200
$ expr ${x} = ${y}
0

# x=100 と y=200 は等しくないので、!= による比較の場合 1 (=TRUE) を返す
$ x=100; y=200
$ expr ${x} != ${y}
1

find

ディレクトリツリーからファイルを検索

find 【検索開始ディレクトリ】 【検索条件】 【アクション】

# ex. カレントディレクトリ(.)を起点に file.txt を検索し(-name 'file.txt')、そのパスを表示(-print)
$ find . -name 'file.txt' -print
./folder/file.txt
./folder/subfolder1/file.txt
./folder/subfolder2/file.txt
./folder/subfolder2/subsubfolder/file.txt

# パス名を表示するアクション -print は find コマンド【アクション】のデフォルトであるため省略可能
$ find . -name 'file.txt'
./folder/file.txt
./folder/subfolder1/file.txt
./folder/subfolder2/file.txt
./folder/subfolder2/subsubfolder/file.txt

【検索条件】 ファイル名で探す

# -name はファイル名の大小文字を区別し、-iname は区別しない 
find 【検索開始ディレクトリ】 -name 【ファイル名】 【アクション】
find 【検索開始ディレクトリ】 -iname 【ファイル名】 【アクション】

# ex. カレントディレクトリを起点に subfile*.log を検索し、そのパスを表示
$ find . -name 'subfile*.log' -print
./folder/subfolder1/subfile1.log
./folder/subfolder2/subfile2.log
$ find . -iname 'SUBFILE*.LOG' -print
./folder/subfolder1/subfile1.log
./folder/subfolder2/subfile2.log

【検索条件】 ファイルの種類で探す

# -type d はディレクトリを、-type f は通常ファイルを検索 
find 【検索開始ディレクトリ】 -type d 【アクション】
find 【検索開始ディレクトリ】 -type f 【アクション】

# ex. カレントディレクトリ以下のディレクトリを列挙
$ find . -type d -print
./folder
./folder/subfolder1
./folder/subfolder2
./folder/subfolder2/subsubfolder

# ex. カレントディレクトリ以下のファイルを列挙
$ find . -type f -print
./folder/file.log
./folder/file.txt
./folder/subfolder1/file.txt
./folder/subfolder1/subfile1.log
./folder/subfolder2/file.txt
./folder/subfolder2/subfile2.log
./folder/subfolder2/subsubfolder/file.txt
./folder/subfolder2/subsubfolder/subsubfile.log

【検索条件】 複数の条件を指定

find 【検索開始ディレクトリ】 【検索条件1】 -a 【検索条件2】 【アクション】

# ex. folder 配下の log ファイルのみ検索
$ find ./folder/ -type f -a -name '*.log' -print
./folder/file.log
./folder/subfolder1/subfile1.log
./folder/subfolder2/subfile2.log
./folder/subfolder2/subsubfolder/subsubfile.log

# -a は省略可能
$ find ./folder/ -type f -name '*.log' -print
./folder/file.log
./folder/subfolder1/subfile1.log
./folder/subfolder2/subfile2.log
./folder/subfolder2/subsubfolder/subsubfile.log

head

ファイルの先頭から指定の行数だけを取り出す

head -n 【行数】 【ファイル名】
head --lines= 【行数】 【ファイル名】

# デフォルトは10行を表示
$ head test.txt
test.txt ファイルの1行目です
test.txt ファイルの2行目です
test.txt ファイルの3行目です
test.txt ファイルの4行目です
test.txt ファイルの5行目です
test.txt ファイルの6行目です
test.txt ファイルの7行目です
test.txt ファイルの8行目です
test.txt ファイルの9行目です
test.txt ファイルの10行目です

# ex. test.txt の先頭行を表示
$ head -n 1 test.txt
test.txt ファイルの先頭行です

less

ファイルの内容をスクロール表示(行数の多いファイルを1画面ごとに上下にスクロール表示)

less 【ファイル名】

# 行番号を表示
less -N 【ファイル名】
less --LINE-NUMBERS 【ファイル名】

less コマンドモード操作

コマンド 内容
スペースキー 1画面下にスクロール
Enter キー 1行下にスクロール
q コマンドモードの終了
/【文字列】 下方向に向かって 【文字列】 を検索

mkdir

ディレクトリを作成する

mkdir 【作成するディレクトリ名】

# 深いディレクトリを一気に作成する
mkdir -p 【作成するディレクトリ名】
mkdir --parents 【作成するディレクトリ名】

# directory を作成し、その配下に sub-directory、さらに配下に sub-sub-directory を作成する
$ mkdir -p directory/sub-directory/sub-sub-directory

mysql

MySQLサーバへ接続しデータベースを利用する

$ mysql -h 【ホスト名】 -P 【ポート番号】 -u 【ユーザ名】 -p
Enter password:
MySQL> 

# 終了する
MySQL> exit / quit

rm

ファイルやディレクトリを削除

# 強制的に削除
rm -f 【ディレクトリ or ファイル名】
rm --force 【ディレクトリ or ファイル名】

# ディレクトリ配下にサブディレクトリやファイルが存在しても削除
rm -r 【ディレクトリ名】

# ex. directory ディレクトリ内にサブディレクトリやファイルが残っていても強制的に削除
$ rm -rf directory

sleep

一定時間、待機する

sleep 【秒数】

$ time sleep 15
real  0m15.003s

while文 などと合わせて一定時間ごとにコマンドを実行する。
例)AWS CLI で認証情報レポートの生成・取得・CSV出力をまとめて実行

ssh

SSHでログインする

# 公開鍵認証でログインする
ssh -i 【秘密鍵】 【ユーザ名】 @ 【ホスト名】

tail

ファイルの末尾を表示

# 表示する行数を指定(デフォルトは10)
tail -n 【行数】

# ex. test.txt の最終行を表示
$ tail -n 1 test.txt
test.txt の最終行です

test

条件の判断

# ex. ディレクトリが存在すれば真
if test -d /home/user; then echo 'ホームディレクトリ以下に user というディレクトリがあります'
fi

# ex. ファイルが存在し、かつ通常ファイルならば真
if test -f /home/test.txt; then echo 'ホームディレクトリに test.txt ファイルがあります'
fi

多くの場合 ShellScript の if 直後に [ ] 記号で使用される

time

コマンド実行時間・リソース利用時間を表示

time 【コマンド】

# ex. sleepコマンドを15秒実行
$ time sleep 15
real  0m15.003s

tr

文字の削除

# 【文字】 で指定した文字を削除
tr -d 【文字】

# ex. test.txt 内のダブルクォートを削除
$ cat test.txt
"000000000000000"
"XXXXXXXXXXXXXXX"
$ tr -d '"' < test.txt
000000000000000
XXXXXXXXXXXXXXX

wc

ファイルの行数を表示

# 改行数を表示
wc -l

# ex. test.txt の改行数を表示
$ cat test.txt | wc -l
12

wget

URLを指定してファイルをダウンロード

wget 【URL】

# ex. http://download/ から file.zip をダウンロード
$ wget http://download/file.zip

which

コマンドのフルパスを表示

# 該当するディレクトリが複数ある場合はすべて表示(エイリアスも表示)
which -a 【コマンド】
which --all 【コマンド】

# ex. コマンド which のフルパスを表示
$ which -a which
alias which='alias | /usr/bin/which --tty-only --read-alias --show-dot --show-tilde'
        /usr/bin/alias
        /usr/bin/which
/usr/bin/which

xargs

標準入力からコマンドラインを組み立てて実行

# 標準入力から受け取ったリストを引数として 【実行したいコマンド】 が実行される
xargs 【実行したいコマンド】

【引数リスト】⇒【標準入力】⇒ xargs【実行したいコマンド】

例えば、引数リストが file1.txt, file2.txt の場合、下記のような動作になる

file1.txt, file2.txt ⇒【標準入力】⇒【実行したいコマンド】file1.txt, file2.txt

多くの場合、find コマンドと組み合わせて利用する

# folder 配下の file*.txt ファイルを検索し、folder_copied へコピー
$ find ./folder/ -type f -name "file*.txt" | xargs cp --target-directory=folder_copied
$ ls folder_copied
file1.txt  file2.txt

パイプ | だけの場合と違い、xargs コマンドは前のコマンド実行結果を引数へ変換し、次のコマンドへ渡す

# パイプだけの場合、find(前のコマンド)の結果を、そのまま cat(次のコマンド)へ渡しているだけ
$ find ./folder/ -type f -name "file*.txt" | cat
./folder/file1.txt
./folder/subfolder1/file2.txt

# xargs を使うことで、find(前のコマンド)の結果が、cat(次のコマンド)の引数になっている
$ find ./folder/ -type f -name "file*.txt" | xargs cat
file1.txt の内容です
file2.txt の内容です
$ cat ./folder/file1.txt ./folder/subfolder1/file2.txt
file1.txt の内容です
file2.txt の内容です

【参考】
https://moffu-mofu.hatenadiary.jp/entry/2018/07/29/225300

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
What you can do with signing up
5