ファイル関連

ファイル操作

ファイル作成

linux でファイル作成をするコマンドいろいろ

空ファイル作成 - touch コマンド
touch ファイル名

ファイルが存在しなければ、指定したファイル名の空ファイルができる。

(ファイルが存在すれば、ファイルのタイムスタンプ(access と modificationらしい)を現在の日時に変更する。)

テキスト作成その1 - vi (vim) コマンド
vi ファイル名
vim ファイル名

テキストエディタ vi(vim) が開くので、適当にテキストを打って保存する。

テキスト作成その2 ー echo コマンド
echo "hoge" > ファイル名
テキスト作成その3 - cat コマンド
cat  > ファイル名 # 入力待ちになるので ctrl d を押して入力を終了する
サイズ指定して作る - dd コマンド
# ランダムな値を 1024 バイトのブロックサイズで 1 ブロック(つまり 1024 バイト)出力する
dd if=/dev/urandom of=ファイル名 bs=1024 count=1

if=/dev/zero だと 0 が 1024 バイト書き込まれる。

ファイル表示

cat コマンド

本来は、ファイルを結合(concat)する目的だと思うが、短いファイルを表示するのに使ったりする。

cat /var/log/messages

スクロールする時は、TeraTerm/Putty など、端末エミュレータのスクロール機能を使う。

less コマンド

1画面に収まらないファイルや標準出力を見る時に使う。

### /var/log/messages を見る
less /var/log/messages

### hoge.tgz 内のファイル一覧を見る
tar tvzf hoge.tgz | less

良く使うキー操作

  • j で下方向
  • l で上方向
  • スペースで次のページ
  • b で前のページ
  • /単語で下方を検索
  • ?単語で上方を検索
  • / で前回検索した単語を下へ検索
  • ? で前回検索した単語を上へ検索
  • F でファイルへの書き出しを待つようになる (tail -f のような動作になる) / CTRL+C で脱出
  • & で指定したパターンにマッチする行だけフィルタして表示

ファイルコピー

linux でファイルをコピーするためには、cp コマンドを使う。

# httpd.conf を httpd.conf.orig にコピー
# 何もオプションを付けなければ、コピー先ファイルのタイムスタンプは、現在時刻
cp httpd.conf httpd.conf.orig

# -p を付けると、モード、オーナー、タイムスタンプもコピーする
cp -p httpd.conf httpd.conf.orig 

ファイル削除

# ファイル削除
rm ファイル名
rm *.txt # *.txt を削除

# ファイルを削除するかどうか確認してから削除
rm -i ファイル名

# 確認せず、強制的に削除
rm -f ファイル名

ディレクトリ操作

ディレクトリ作成

mkdir コマンドを使う。

mkdir ディレクトリ名
mkdir -p 何か/パス/名 # 途中のディレクトリが無ければ自動的に作る

ディレクトリコピー

cp コマンド
# /var/log 以下を root のホームディレクトリにコピー
cp -rp /var/log ~root # root のホームディレトリに log ディレクトリがコピーされる

# root のホームディレクトリに log.bak ディレクトリがあれば、log.bak ディレクトリ以下に、log ディレクトリができる
# root のホームディレクトリに log.bak ディレクトリがなければ、log.bak ディレクトリとしてコピーされる
cp -rp /var/log ~root/log.bak
tar コマンド

tar コマンドを使うこともできる。

# カレントディレクトリを /dokoka/path にコピー)
tar cf - . |  (cd /dokoka/path; tar xf -)
tar cf - . |  tar xf - -C /dokoka/path

# カレントディレクトリを dokoka-no-server の /dokoka/path にコピー
# dokoka-no-server に ssh でログインできる場合
tar cf - . | ssh dokoka-no-server tar xf - -C /dokoka/path
rsync コマンド

rsync を使うこともできる。

rsync は、ファイルを比較して新しければコピーしてくれるので、例えば、私は、HTML ファイルのアップロードに使っている。

# カレントディレクトリを /tmp/hoge にコピーする
rsync -av . /tmp/hoge

# カレントディレクトリを my-web-server の ~/www にコピーする。(ssh ログインできる必要あり)
# z フラグは圧縮、C は .git などをコピーしない
# 【危険!!!】--delete はコピー元にファイルが無ければ、コピー先を削除
rsync -avzC --delete . my-account@my-web-server:~/www 

ディレクトリ削除

# ディレクトリ内が空の場合は削除できる
rmdir ディレクトリ名

# ディレクトリ内も削除
rm -r ディレクトリ名

# 確認せずに、ディレクトリ内も削除
rm -rf ディレクトリ名

検索

ファイルの検索といっても、ファイル名で探したい場合もあれば、ファイル内の単語で検索したい場合があると思う。

ファイル内の単語で検索 - grep コマンド

# カレントディレクトリの *.md ファイルから hoge が含まれているファイルを検索
grep hoge *.md

# カレントディレクト以下から hoge が含まれているファイルを検索
grep -R hoge . # シンボリックリンクを辿る
grep -r hoge . # シンボリックリンクを辿らない

# 大文字小文字を区別せずに検索
grep -i hoge *.md

# 正規表現で検索
grep -E '(hoge){2,}' *.md # hogehoge や hogehogehoge などがマッチ。hoge にはマッチしない。

詳しくは、man grep や info grep を参照。

ファイル名で検索 - find コマンド

# カレントディレクトリ(.) 以下の *.md を検索
find . -name \*.md -print
find . -name '*.md' -print

# カレントディレクトリ以下の *~ を検索
find . -name '*~' -print

# カレントディレクトリ以下の *~ を削除
find . -name '*~' -delete


# カレントディレクトリ以下の *.log を gzip で圧縮
# {} には、マッチしたファイル名が入る
find . -name '*.log' -exec gzip {} \;

# ファイルを検索
find . -type f -print
find . -type f -name 'hu*' -print # ファイルかつ hu*
find . -type f | grep -E 'hu.*' # find コマンドの結果を grep に渡して検索


# ディレクトリを検索
find . -type d -print

# 更新日が直近 24 時間未満
find . -mtime 0 # 何も付けなければ、-print になる

# 更新日が昨日 (24時間以上、48時間未満)
find . -mtime 1

# 更新日が 30 日未満
find . -mtime -30
find . -mtime -30 -ls

# 更新日が 30 日超
find . -mtime +30
find . -mtime +30 -ls


. の所に、ディレクトリ名を指定すると、指定ディレクトリからの検索になる。

詳しくは、man find や info find を参照。

ディスク使用量

linux でディスク使用量、空き容量を確認する

df コマンド

ファイルシステムの使用量を表示。(disk free の略?)

# ディスク使用量、空き容量を表示
df

# G、K など人間が読みやすい形式で表示
df -h
  • df –help でヘルプを表示
  • man df コマンドで詳細なドキュメントを表示

du コマンド

ファイル使用量の表示(disk usage の略?)

# カレントディレクトリのディスク使用量を表示(通常は1024バイト単位だが、512バイト単位のこともあり)
du

# 下位のディレクトリの表示を省略する
du -s

# カレントディレクトリ下のディレクトリの容量を表示
du -s *

# /var/log にあるディレクトリの容量をソートして表示
du -sb /var/log/* | sort -n
du -sh /var/log/* | sort -h # KMG で表示、ソート

# バイト単位で表示
du -b

# KiB (1024 バイト単位で表示)
du -k
du --block-size=1k
du -BK # K が付く

# MiB (1024*1024 バイト単位で表示)
du -m
du --block-size=1m
du -BM # M が付く

# GiB (1024*1024*1024 バイト単位で表示)
du --block-size=1g
du -BG # G が付く
  • du –help でヘルプを表示
  • man du コマンドで詳細なドキュメントを表示

圧縮・解凍

ファイル単体

linux で1個のファイルを圧縮、伸長(展開、解凍)する

圧縮 - gzip コマンド
# hoge というファイルを hoge.gz に圧縮する
gzip hoge

# hoge を圧縮して標準出力に出力する
# 以下の例は、hogehoge.gz に出力
gzip -c hoge > hogehoge.gz
伸長 - gunzip コマンド
# hoge.gz を hoge に戻す
gunzip hoge.gz

# hoge.tgz を元に戻して標準出力に出力する
gunzip -c hoge.gz
伸長 - zcat コマンド

gz ファイルを伸長して cat(ファイルを結合) する。

# messages*.gz を gunzip して cat したものを less で見る
zcat messages*.gz | less
gzcat messages*.gz | less # gzcat の場合もあり?

.tgz (.tar.gz) ファイル圧縮・展開(解凍)

linux で .tgz (.tar.gz) ファイル圧縮、展開(解凍)する

# hoge ディレクトリを hoge.tgz ファイルに圧縮する
tar cvzf hoge.tgz hoge # 昔風の指定方法
tar -cvzf hoge.tgz hoge

# hoge.tgz のファイル一覧を見る
tar tvzf hoge.tgz
tar tvf hoge.tgz # 今時はこれでもいける?
gunzip -c hoge.tgz | tar tvf - # gunzip と tar をパイプして使う

# openssl enc -aes128 -in hoge.tgz -out hoge.tgz.aes128 で aes128 暗号化した圧縮ファイルの一覧表示
openssl enc -aes128 -d -in hoge.tgz.aes128 | tar tvzf - 


# hoge.tgz を展開する。
tar xvzf hoge.tgz

# hoge.tgz をディレクトリ /tmp に展開する。
tar xvzf hoge.tgz -C /tmp # 昔風の指定方法
tar -xvzf hoge.tgz -C /tmp

cvzf を czf に、xvzf を xzf にすれば、ファイル一覧を表示しない。

z フラグがなければ、圧縮はされない (tar)になる。

zip ファイル圧縮、展開(解凍)

zip コマンドをインストールする必要がある。

ubuntu の場合、以下のようにする。

sudo apt install zip
ファイル圧縮、展開(解凍)
# hoge フォルダーを hoge.zip に圧縮する
# -r は再帰的(ディレクトリを辿る)
zip -ur hoge.zip hoge

# hoge フォルダーをパスワード付きで hoge.zip に圧縮する
zip -ure hoge.zip hoge

# zip ファイル内の一覧表示
unzip -l hoge.zip

# zip ファイルを展開(解凍)
unzip -x hoge.zip

zip だとパーミッションなどが保存できないので、tar (.tar.gz) を使うことが多い。

zip 暗号化
# hoge ディレクトリを zip でパスワード付きで圧縮する
zip -ure /tmp/hoge.zip hoge

# hoge ディレクトリを zip でパスワード付きで圧縮する
zip -ure /tmp/hoge.zip hoge

# カレントディレクトリに暗号化付き zip を展開(解凍)する
unzip /tmp/hoge.zip

暗号化、復号

linux でファイルを暗号化、復号する

openssl コマンド

# ファイル hoge を aes128 で暗号化し、hoge.aes128 に出力する
openssl enc -aes128 -in hoge -out hoge.aes128

# ファイル hoge.aes128 を aes128 で復号し、hoge.decrypted に出力する
openssl enc -d -aes128 -in hoge.aes128 -out hoge.decrypted

# カレントディレクトリを tar gz し、aes128 で暗号化し、/tmp/hoge.tgz.aes128 に出力する
tar cf - hoge | openssl enc -aes128 -out /tmp/hoge.tgz.aes128 

# /tmp/hoge.tgz.aes128 を復号し、tar gz で /tmp に展開(解凍)する
openssl enc -d -aes128 -in /tmp/hoge.tgz.aes128 | tar xf - -C /tmp

ファイル数カウント

linux でファイル数を数える方法

ls や find 出力の 行数を数える

ls | wc -l
ls -l | grep -v '^total' | wc -l
find . -type f  | wc -l

システム管理

ユーザー切り替え

現在ユーザーの確認

id

ユーザー切り替え

# root になる
su - 
sudo -s

# www になる
su - www
sudo -s -u www

# root で rm /var/log/messages.* を削除
sudo rm /var/log/messages.*

ipアドレス

ip アドレスの確認方法

ifconfig コマンド(昔ながらの方法)

ifconfig -a

ip コマンド

ip addr

メモリ確認

linux でメモリ容量を見る

free コマンド

free

実行すると、メモリの使用量が表示される。

Mem: が物理メモリの使用量

Swap: はスワップファイルの使用量

top コマンド

top

# q で終了する

MiB Memory: の行の xxx free と出ている箇所が残りのメモリ量

os バージョン確認

linux で OS のバージョンを確認する

# カーネルバージョンの確認
uname -a

# ディストリビューションの確認
cat /etc/os-release # debian / redhat 共通?
cat /etc/lsb-release # debian 系 (debian、ubuntu など)
cat /etc/rehat-release # redhat 系 (rhel、centos など)

使用中ポートの確認

netstat

# すべての接続を表示
netstat -an

# リッスン中の接続を表示
netstat -ln

# プログラム名も表示
netstat -anp

lsof

# ipv4 の接続と使用中のプログラム名を表示
lsof -i4

# リッスン状態の接続を表示
lsof -i4 -sTCP:LISTEN

ユーザー一覧

linux でユーザー一覧を確認する

ユーザー一覧

パスワードファイルを表示。一番左端がログインID。

cat /etc/password

ユーザー登録

useradd -m ログインID # 一般ユーザー
useradd -m -G wheel ログインID # wheel グループ(管理者グループ)に追加

ユーザー削除

userdel ログインID # ホームディレクトリは残る
userdel -m ログインID # ホームディレクトリも削除

ユーザー編集

usermod -G wheel ログインID # wheel グループに追加

詳しくは以下を参照

  • man useradd
  • man userdel
  • man usermod

shutdown

linux の停止方法について

電源ボタン

物理的な電源ボタンや、クラウド環境なら、画面上の電源メニューから停止する。

電源 off - shutdown コマンド

# os バージョンやディストリビューションバージョンによって違うかも
shutdown -h now
shutdown -p now
systemctl poweroff

再起動 - reboot コマンド

再起動だけさせたいとき。

reboot
systemctl reboot

など

リモート接続・端末関連

リモート接続 (ssh)

# dokoka に dareka ユーザーで接続
ssh dareka@dokoka

# ポートフォワード(ローカルをリモートに転送)
# dokoka に dareka ユーザーで接続
# ローカルの 12345 番ポートに接続すると、(dokoka から見える)sonosaki の 9999 番ポートに接続
ssh -L 12345:sonosaki:9999 dareka@dokoka

# ポートフォワード(リモートをローカルに転送)
# dokoka に dareka ユーザーで接続
# dokoka の 12345 番ポートに接続すると、localhost の 9999 番ポートに接続
ssh -R 12345:localhost:9999 dareka@dokoka

# dokoka に dareka ユーザーで接続
# 1080 番が socks プロキシになる。
# 例えば、ファイアウォールの外にある dokoka があり、ブラウザのプロキシ設定に、localhost 1080 を設定すると、
# ファイアウォールを越えてアクセスできる。
ssh -D 1080 dareka@dokoka

端末多重化 (tmux)

一つの画面で複数の端末を使う。 一つの画面を分割して使ったり、タブのように切り替えて使うことができる。

また、操作中に、ssh 接続が切れてしまった場合などでも、端末を復元できるので便利である。 ssh 接続が切れてもコマンドを実行させ続けることができる。

何も設定していないと、C-b (ctrl+b) に機能が割り当てられる。 シェルのヒストリを使う時、C-b はカーソルを左に移動するキーとして割り当てられており、C-b が使えないのは不便である。 私は、以下のような設定ファイルを作って、C-t に割り当て直している。C-t はそれほど使わないのと、tmux の頭文字 t なので覚えやすいため。

~/.tmux.conf

set-option -g prefix C-t
unbind-key C-t
bind-key C-t send-prefix
# tmux を起動
tmux

# 切断された tmux に接続
tmux a

最低限覚えておくと便利な tmux のキー操作。(C-t に機能を割り当て直した場合)

  • C-t " 画面を上下に分割
  • C-t o 分割した画面の移動(other)
  • C-t c 別タブを開く(
  • C-t p 前のタブに移動(previous)
  • C-t n 次のタブに移動(next)
  • C-t [ コピーモード
  • コピーモードで ctrl+space コピー開始位置を指定(wsl だと space だった)
  • 領域選択中 ctrl+w で選択中の領域をコピー(wsl だと enter だった)
  • C-t ] ペースト
  • C-t d tmux を切断 (tmux a で復元)
  • C-t ? ヘルプ

GitHub (github cli)

github cli をインストールしておく。

リポジトリの作成

gh repo create リポジトリ名 --public # リポジトリを公開
gh repo create リポジトリ名 --private # リポジトリを非公開(プライベート)

リポジトリの削除

gh repo delete リポジトリ名
HTTP 403: Must have admin rights to Repository. (リポジトリURL)
This API operation needs the "delete_repo" scope. To request it, run:  gh auth refresh -h github.com -s delete_repo 

が表示される場合は、

gh auth refresh -h github.com -s delete_repo

を実行する。

プロンプトに対して enter を押すとブラウザが起動するので、ログインすると削除権限が有効になる。

権限を有効にした後、gh repo delete 〜 を再度実行すると削除できる。

AWS (awscli)

route53 でドメインをホスティングする

aws route53 create-hosted-zone help の EXAMPLES より。

実行方法

aws route53 create-hosted-zone --name cli.ink --caller-reference $(date -Iseconds)

–caller-reference は二重に実行されるのを防ぐために付ける必要があり、ユニークな文字列。例えば日付(2023-08-27T10:59:36+09:00 など)。

実行結果

{
    "Location": "https://route53.amazonaws.com/2013-04-01/hostedzone/Z03152101KADHH6ZWJXPP",
    "HostedZone": {
        "Id": "/hostedzone/Z03152101KADHH6ZWJXPP",
        "Name": "cli.ink.",
        "CallerReference": "2023-08-27T10:57:06+09:00",
        "Config": {
            "PrivateZone": false
        },
        "ResourceRecordSetCount": 2
    },
    "ChangeInfo": {
        "Id": "/change/C09011133GV9PTWRON1ZU",
        "Status": "PENDING",
        "SubmittedAt": "2023-08-27T01:57:07.629000+00:00"
    },
    "DelegationSet": {
        "NameServers": [
            "ns-1694.awsdns-19.co.uk",
            "ns-36.awsdns-04.com",
            "ns-907.awsdns-49.net",
            "ns-1306.awsdns-35.org"
        ]
    }
}

ここで返ってくる NameServers をドメインプロバイダのネームサーバに設定すれば、route53 でドメインの管理をすることができるようになる。