シェルで簡単なUIを作成する方法

Linux

こんにちは。
さくさくTECHブロガーの「さく」です。


よくシェルを使ったバッチなどの一括処理を実行したりしますが、シェルで簡単なUIを作成することもできます。
今回は、実際にサンプルシェルプログラムを作成してみます。


■標準入力を受け取る”read”コマンド


標準入力を受け取るには、readコマンドを使用します。
以下の例では、-pオプションを使用して、入力文字列の前に選択肢の文字列を表示しています。


read -p "削除するフォルダを選択して下さい。[ 'A' or 'B' or 'C']." input

function化して部品化


決められた文字の入力のみを想定している場合、イレギュラーな文字を入力された場合の制御は意外と厄介です。
function化することで、シェルプログラムの煩雑化を防ぐことができます。


function select_delete() {
  read -p "削除するフォルダを選択して下さい。[ 'A' or 'B' or 'C']." input

  if [ -z $input ] ; then
    select_delete               # ←何も入力されなかった場合は再び"select_delete()"を呼び出す
  elif [ $input = 'A' ] ; then
    return 1
  elif [ $input = 'B' ] ; then
    return 2
  elif [ $input = 'C' ] ; then
    return 3
  else
    select_delete               # ←A・B・C以外が入力された場合は再び"select_delete()"を呼び出す
  fi
}
select_delete                   # ←通常の呼び出しパターン"select_delete()"を呼び出す

 


処理と組み合わせる

[display_update_date]


サンプルシェルプログラムを作ってみました。
削除したいフォルダが「A」「B」「C」の3つ存在するとした場合、どれを消すかを選択してもらえれば削除するシェルプログラムになります。


このサンプルはわざわざシェル化する必要ないようなものですが、いろいろな用途で使えるテクニックかと思います。


#!/bin/bash

function select_delete() {
  read -p "削除するフォルダを選択して下さい。[ 'A' or 'B' or 'C']." input

  if [ -z $input ] ; then
    select_delete
  elif [ $input = 'A' ] ; then
    return 1
  elif [ $input = 'B' ] ; then
    return 2
  elif [ $input = 'C' ] ; then
    return 3
  else
    select_delete
  fi
}
select_delete
mode=$?

if [ ${mode} =  1 ]; then
   rm -fr A
elif [ ${mode} =  2 ]; then
   rm -fr B
elif [ ${mode} =  3 ]; then
   rm -fr C
else
   exit 0
fi

バッチ処理の二重起動チェックをシェルだけで実現する方法

Linux

Linux系のОSでバッチを起動する場合は、シェルを作成して、シェルからJavaなどのプログラムを呼び出すケースが多いかと思います。


バッチで問題になるのが「バッチの重複起動」になります。
“バッチ突き抜け”とも言いますが、1つのバッチが終了する前に同じバッチが起動してしまうと二重起動の状態になってしまい、思わぬ不具合が発生してしまいます。
この場合、プログラム側で重複起動をおこなわないような制御をおこなう必要があります。


今回は、このバッチ重複起動チェックをシェルだけで実現する方法を紹介します。

シェルだけで実現する方法なので非常にシンプルですが、確実に二重起動チェックを防ぐことができます。


環境情報


  • OS:CentOS 7.6

pgrepコマンドとは


重複起動チェックで使用するコマンドは「pgrep」コマンドです。
「pgrep」コマンドは、プロセスが保持しているプロセス名属性からプロセスIDを取得するコマンド
になります。


要は「pgrep」コマンドは、「ps」コマンドと「grep」を合体したコマンドですね。
psコマンドの出力結果をパイプ(|)で繋いでgrepで抽出することが多いかと思いますが、この操作を同時に実行することが「pgrep」コマンドになります。


基本的な文法は以下になります。

pgrep [オプション] [プロセスの特定パターン]

二重起動チェックのシェルプログラム


二重起動チェックのシェルプログラムは以下になります。
「pgrep」コマンドで自身のプロセス名のプロセス番号を取得し、そのプロセス番号と自身のプロセス番号と比較しています。
プロセス番号の比較結果が異なる場合は、自身のプロセスと同名の他プロセスが動作していると判断する、ということですね。


#!/bin/sh

echo "start"
PGREP=`pgrep -f $0 -o`
PGREP_RSLT=$?

if [ $$ != $PGREP  ];
then
  echo "$0は起動中です。二重起動チェックです。"
  exit 1
fi

sleep 180
echo "end"

上記サンプルプログラムを同時に実行すると、一方のシェルはチェックに掛かって起動できません。
二重起動チェックにかかりやすいように、180秒のスリープをおこないバッチ実行中の時間を長くとっています。


pgrepコマンドのオプションと特定パターン


二重起動チェックで使用している「pgrep」コマンドのオプションや、使用している特殊変数について説明していきます。


まずは「pgrep」コマンドのオプションです。
二重起動チェックで使用しているのは「-f」オプションと「-o」オプションになります。


「-f」「-o」オプション含めて、よく使用するオプションを紹介しておきます。


オプション フルオプション 説明

-f

–full

コマンドライン全体をパターンマッチの対象とする。

-o

–oldest

対象のプロセスから最も昔に起動されたものだけを対象とする。

-n

–newest

対象のプロセスから最も最近に起動されたものだけを対象とする。

-U ユーザ

–uid ユーザ

指定したユーザのプロセスを対象とする。「,」区切りで複数指定可能。

-v

–inverse

検索パターンの否定。


次に特殊変数についてです。


  • $0:実行中プロセスのシェルファイル名。
  • $?:直前に実行したコマンドの実行結果。成功時は「0」。失敗時は「0」以外。
  • $$:実行中プロセスのプロセスID。

この特殊変数は非常に便利です。
実際の動きを紹介していきます。


$0特殊変数。実行中プロセスのファイル名。


実行中プロセスのシェルファイル名は「test.sh」となります。
そのファイル名がそのまま特殊変数として格納されています。


#!/bin/sh

echo "start"
echo $0
echo "end"

test.sh

$?特殊変数。コマンド実行結果。


コマンドの実行結果が格納されています。
厳密にはコマンドの実行結果を参照して、二重起動チェックに成功したか?失敗したか?についても処理分岐が必要となります。


#!/bin/sh

echo "start"
PGREP=`pgrep -f $0 -o`
echo $?
echo "end"

0

$$特殊変数。実行中プロセスのプロセスID。


実行中プロセスのプロセスIDが格納されています。


#!/bin/sh

echo "start"
echo $$
echo "end"

4269


Linuxでサーバ容量・フォルダサイズ・ファイルサイズを調べるコマンド

Linux

Linuxサーバ上で、サーバ全体のディスク使用率や、フォルダサイズ・ファイルサイズを調査する時に便利なコマンドについて紹介していきます。


サーバ容量を確認する(dfコマンド)


サーバ全体の容量について確認する際に使用するのはdfコマンドになります。


[@users]$ df
ファイルシス   1K-ブロック     使用    使用可 使用% マウント位置
devtmpfs           3981472        0   3981472    0% /dev
tmpfs              3999296      260   3999036    1% /dev/shm
/dev/sda1           613184     6908    606276    2% /boot/efi

オプションには、以下があります。


-a

すべてのディスクを表示。

隠しファイルシステムなど、全てのディスクを表示します。

-H

単位を付けて結果を表示。

容量の表示は数字が大きくなってしまうので、k(キロ)、M(メガ)、G(ギガ)の単位を付けて表示するのが一般的です。


フォルダサイズを確認する(duコマンド)


フォルダのサイズを確認する時はduコマンドを使用します。


[@users]$ du
28      ./numberAnalyze/module
1088    ./numberAnalyze/logs
1124    ./numberAnalyze
16      ./winningAnalyze/module
916     ./winningAnalyze/logs
940     ./winningAnalyze
16      ./winningExpected/module
26044   ./winningExpected/logs
26068   ./winningExpected
12      ./winningCollection/module/__pycache__
24      ./winningCollection/module
12      ./winningCollection/logs
44      ./winningCollection
28184   .

duコマンドではフォルダサイズだけではなく、ファイルサイズも確認することができます。
以下のコマンドでは、コマンドを発行しているフォルダ直下ファイルのファイルサイズも表示します。


[users]$ du ./*
4       ./loto.sh                       ★
28      ./numberAnalyze/module
1088    ./numberAnalyze/logs
1124    ./numberAnalyze
16      ./winningAnalyze/module
916     ./winningAnalyze/logs
940     ./winningAnalyze
12      ./winningCollection/module/__pycache__
24      ./winningCollection/module
12      ./winningCollection/logs
44      ./winningCollection
16      ./winningExpected/module
26044   ./winningExpected/logs
26068   ./winningExpected

★=直下のファイル


以下のコマンドでは、もう1階層下フォルダのファイルサイズを表示します。


[users]$ du ./*/*
1088    ./numberAnalyze/logs
28      ./numberAnalyze/module
4       ./numberAnalyze/numberAnalyze.sh         ★
916     ./winningAnalyze/logs
16      ./winningAnalyze/module
4       ./winningAnalyze/winningAnalyze.sh       ★
12      ./winningCollection/logs
12      ./winningCollection/module/__pycache__
24      ./winningCollection/module
4       ./winningCollection/winningCollection.sh ★
26044   ./winningExpected/logs
16      ./winningExpected/module
4       ./winningExpected/winningExpected.sh     ★

★=1階層下のファイル


指定した階層のフォルダサイズを確認したい場合は「–max-depth」オプションを使用します。
以下のコマンドでは、コマンドを実行したフォルダ直下について、フォルダ毎のサイズを表示しています。


[users]$ du --max-depth=1
1124    ./numberAnalyze
940     ./winningAnalyze
26068   ./winningExpected
44      ./winningCollection
28184   .

サイズを調べるフォルダを深くしたいきたい場合は、「–max-depth」オプションの数字を大きくしていけばよいです。

数字が大きいほど、下の階層まで検索対象となります。

[users]$ du --max-depth=2
28      ./numberAnalyze/module
1088    ./numberAnalyze/logs
1124    ./numberAnalyze
16      ./winningAnalyze/module
916     ./winningAnalyze/logs
940     ./winningAnalyze
16      ./winningExpected/module
26044   ./winningExpected/logs
26068   ./winningExpected
24      ./winningCollection/module
12      ./winningCollection/logs
44      ./winningCollection
28184   .

上記以外のよく使うオプションも紹介しておきます。


-h

読みやすい単位で表示する。

-H

読みやすい単位で表示する。

ただし、1024単位ではなく1000単位の値を使用。

-c

合計のサイズも表示

-k

キロ単位で表示

-m

メガ単位で表示



現場で使えるtailコマンド。ログ監視で必要なオプションなど。

Linux

運用・保守の業務をおこなっている人にとっては、とても馴染みがあるコマンドのtailコマンドについてまとめてみます。


筆者が一番使うタイミングは、やっぱりログ監視です。

tailは「尻尾」「末尾」の略ですが、tailコマンドを使えばファイルの終端を常に表示するので、稼働中システムのログを監視する際にとても便利です。


基本動作


tail ※ファイル名 で、ファイルの末尾を表示することができます。


$ tail file1.txt
テスト8
テスト9
テスト10

追記を監視(ラージFとスモールf)


基本動作の tail ※ファイル名 だけでは、ファイルが追記されいったとしてもコマンド上に追記内容が表示されません。


しかしこれだと、例えばアプリケーションのログ監視をおこなう場合に不便です。
アプリケーションがログに追記するたびに表示内容を更新する(常に末尾表示)ためには、-f オプションを使用します。


$ tail -f file1.txt
テスト8
テスト9
テスト10
$ tail -f file1.txt
テスト9
テスト10
テスト11 ← 追記されている。

上記は-f(スモールf)を使っていますが、ログ監視のことを考えると不便な事があります。
それはログのローテーションです。


指定しているファイルがリネームされて新しいファイル名となり、指定しているファイルが新規ファイルとなった場合、-f(スモールf)では末尾監視がおこなわれません。


tailコマンドで監視できない

ログローテーションのように、監視対象のファイルが新しく作成された場合も監視した場合は、-f(スモールf)ではなく-F(ラージF)を使います。
-F(ラージF)を使う事で、ファイル名が変わって監視対象ファイルが新規作成されたとしても、対象ファイルは監視が継続されます。


$ tail -F file1.txt
tail: `file1.txt' has become inaccessible: No such file or directory
tail: `file1.txt' has appeared;  following end of new file
tail: file1.txt: file truncated
ファイル1
ファイル2
ファイル3

行数を指定する(-n)


末尾の表示する行数を指定示することも可能です。


$ tail -n3 file1.txt
ファイル9
ファイル10
ファイル11

-fオプションを指定して、末尾N行を監視する、といったことも可能です。


$ tail -3f file1.txt
ファイル9
ファイル10
ファイル11

パイプで繋げてgrepで抽出


特にtailコマンドのオプションではないのですが、大量にログを出力するアプリケーションであれば、-fオプションを指定していてログを監視していてもログが流れるのが早くて目で追えないです。

その場合は、監視しておきたいキーワードを事前に決めておき、パイプ(|)で繋いでgrepコマンドで抽出するようにしておきます。


$ tail -f file1.txt | grep ※キーワード
ファイル12

上記のようにパイプで繋いでgrepを指定することで、grepで指定したキーワードが出現した時だけ表示してくれます。

とても効率的なログ監視をおこなうことができます。


まとめ


現場のエンジニアにとって、tailコマンドは必須のコマンドかと思います。
上手に使いこなして、日々の作業に役立ててください。




シェルで外部ファイルを読み込む。サンプルシェルで解説。

Linux

今回は、シェルで外部ファイルを読み込む方法を紹介します。


シェルファイルは、非常に強力なスクリプトです。
使い方によっては、ちょっとした機能は実現することができます。


外部ファイルの読み込みパターン


外部ファイルを読み込むパターンとして、以下の2パターンについて説明します。


  • 外出し定義ファイルの読み込み
  • シェルからシェルを呼び出す

外出し定義ファイルの読み込み


シェルでちょっとした機能を実現する際に、さまざまなパラメータを外部ファイルに定義することが必要になる場合があります。
ファイル読み込み・書き込み系のシェルであればファイルパスを外部ファイルに定義したり、ですね。

そういった外部ファイル定義についてもシェルで可能です。


外部ファイル読み込みのサンプルシェル


サンプルシェルは以下になります。

#!/bin/sh
# 
# 外部ファイルの読み込み
# 

    echo "start."
    while read line
    do
        KEY=`eval echo $line | awk '{print $1}'`
        VAL=`eval echo $line | awk '{print $2}'`
        echo $KEY
        echo $VAL
    done < setting.config
    echo "end."

外部ファイルとなる「setting.config」は以下です。

line1    value1
line2    value2
line3    value3

実行結果は以下になります。

$ sh configLoad.sh
start.
line1
value1
line2
value2
line3
value3
end.

行データを繰り返し読み込む


行データを読み込む方法は以下になります。


while文で、自動的に最終行まで外部ファイルの読み込みをおこなっていきます。
読み込み対象ファイルをdone部分に記載することで、対象ファイルの読み込むをおこないます。


上記サンプルプログラムは、シェルファイルと同フォルダに、外部ファイルとなる「setting.config」が存在する状態のシェルファイルとなります。

    while read line
    do
        ・・・制御・・・
    done < 設定ファイルパス

lineに1行データが格納されるので、”・・・制御・・・”の部分にlineに対する処理を記載することになります。


awk(オーク)コマンドで列ごとに読み込み


awk(オーク)コマンドは、文字列を抽出するコマンドになります。
{print $N}で、N番目の列を抽出することができます。


上記のサンプルプログラムは、2列の行データなので、{print $2}までしかないですが、列をもっと増やしていきたい場合は、{print $3}といった具合に列の数を増やしていけば、対象の列データを読み込むことができます。


シェルからシェルを呼び出す


共通機能を定義したシェルを準備した場合、そのシェルを他のシェルから呼び出したい場合があります。

つまり、シェルからシェルを呼び出す、ということですね。


シェルからシェルを呼び出すサンプル


サンプルシェルは以下になります。

呼び出すシェルと呼び出されるシェルの2つになります。


呼び出す側のシェル

#!/bin/bash

`./sub.sh`
RET=$?
echo $RET

呼び出される側のシェル

#!/bin/sh
exit 10

シェルを呼び出す


シェルを呼び出す場合の記載は簡単です。

シェルのパスを「`」で囲めば呼び出すことができます。


`./sub.sh`

シェルから返り値を受け取る


シェルから返り値を受け取る場合は、呼び出される側は「$?」で取得できます。


RET=$?

呼び出される側は、「exit」を用いて返り値を返却できます。


exit 10



VMWarePlayer上にCentOSをインストールして動かしてみる

Linux

今回は、VMWare上にCentOSをインストールして動かす方法を紹介します。


Linuxに限らず、普段はWindowsを使って作業している人が、他のOS環境も必要な場合があるかと思います。
そういう場合は、VMWareを使う方法が最も簡単です。

Windows上に仮想のHDを割り当てて、別OSの環境を構築できます。


しかも、別サーバに環境を移植したい場合は、VMWareのファイル一式をコピーすれば、簡単に引っ越しも可能です。


今回は、Winodows10上にVMWareをインストールして、CentOSを構築する方法を紹介します。


環境情報


  • ホストマシン:Windows10
  • VMWare:15.5.2 build-15785246
  • CentOS: release 8.1.1911

VMWareをダウンロードしてインストール


以下のURLからダウンロードします。



インストーラを起動すると、いきなり以下のポップアップウィンドウが表示されます。
どうやら、「Microsoft VC」をインストールする必要がありそうです。
とりあえず、ホストとなるインストール端末を再起動します。


VCのインストール

※筆者の場合は自動的にインストールされたようで、再起動してインストールを再開したら再度ダイアログが表示されることはなかったです。


インストール端末を再起動したら、再度インストーラを起動します。
インストールは、画面のウィザードに沿ってインストールしていけば大丈夫です。

最終的に以下のダイアログが表示されればインストール完了です。


VMWareのインストール完了

CentOSをダウンロードしてインストール


CentOSは、以下のURLからダウンロードします。


isoredirect.centos.org
CentOS
http://isoredirect.centos.org/centos/8/isos/x86_64/CentOS-8.1.1911-x86_64-dvd1.iso
In order to conserve the limited bandwidth available, ISO images are not downloadable from mirror.centos.org

ミラーリングサイトを選択し、ISOファイルをダウンロードします。
7GBなので、結構時間がかかります
筆者は5Hくらいかかりました。


VMWare上にインストールするための準備として、まずはCentOSのISOファイルをマウントします。



マウントするとISOファイルがドライブとして認識されます。



この状態でVMWareを起動します。
VMWareが起動したら、「新規マシンの作成」を選択します。



「インストーラディスク」にマウントしたCentOSのドライブを選択し、「次へ」を押下します。



Linuxの情報を入力します。

ここでの「パスワード」は、rootユーザのパスワードになるので忘れないようにしましょう。



次に仮想マシンの名前を入力します。
自分で解りやすい名前をつければいいです。


CentOSのマシン名設定

次にディスク容量の指定をおこないます。
仮想マシンに割り当てる最大のディスクサイズになります。
筆者は、とりあえずデフォルトの20GByteにしました。



最後に確認画面が表示されます。
一応さらっと確認して、「完了」ボタンを押下します。


完了ボタンを押下したらインストールが開始します。
いきなり以下の確認ダイアログが表示されます。



ひとまず必要なさそうなので、「後で通知する」を選択してスキップします。


「Pane is dead」が表示されて画面が固まる


インストールを開始したと思ったら、何かVMWareのウィンドウが固まっているように見えます。
下の方には「Pane is dead」と表示されています。
日本語では、”画面(ペーン)が死んでいます”ですかね。。。


Pane is deadの表示

原因がよくわからないので、とりあえずもう1回同じ事をしてインストールしてみます。
しかし、それでも同じでした。。。


いろいろ調べたのですが、筆者の場合は以下の方法で回避できました。
とりあえず、VMWareで空のハードディスクを作ります



その後にインストールすると、ひとまずインストールが無事に完了しました。


以下に、空のハードディスクを作ってインストールする方法を紹介します。


空のハードディスクを作ってインストールを継続


インストールが進むと、インストールで使用する言語の選択ウィンドウが表示されます。
日本語を選択します。


CentOSの言語の選択

インストール概要ウィンドウが表示されるので、「インストールの開始」ボタンを押下します。



インストールが始まります。
空のハードディスクからインストールしたので、rootパスワードが設定されいないという表示になっています。
ひとまず、インストールが完了するのをまちます。


CentOSのインストール中

インストールは完了したのですが、設定に必要な項目が残っているので次に進めないです。
まずは、rootパスワードを設定します。


CentOSのrootパスワードの設定

rootのパスワードを設定したら、「設定完了」ボタンを押下します。


インストールが完了したら再起動ボタンを押下して、インストールを完了します。


CentOSの設定完了

再起動後の設定


再起動したら、初期セットアップウィンドウが表示されます。
まず、ライセンス情報を確認します。


CentOSのライセンス設定

「ライセンス契約に同意します」にチェックし、完了ボタンを押下したら完了です。

CentOSライセンスの同意

初期セットアップでの設定は完了です。
設定の完了ボタンを押下して、次に進みます。

最初にウェルカムウィンドウが表示されます。
「次へ」を押下します。

CentOSのインストール完了

位置情報サービスってやつがあるんですね。
これは必要なさそうなので、オフにして次へボタンを押下します。

CentOS位置情報の設定

オンラインアカウントへの接続も今回はおこまいません。
スキップします。

CentOSオンラインアカウント

ユーザ情報を入力します。

CentOSユーザ情報の入力

次にパスワードを入力します。
先ほど入力したユーザのパスワードになります。


これで完了です。
「CentOSを使い始める」を選択します。


先ほど作成したユーザが表示され、ログイン可能な状態になっています。
パスワードを入力して、ログインしてみます。


以下のようなウィンドウが表示されたインストール完了です。

おつかれさまでした。


CUIのウィンドウを開きたい場合は、「アクティビティ」→「端末」を選択します。





クーロン設定での小技集。設定の基本と、ちょっとしたテクニックを紹介

Linux

今回は、ちょっと特殊なクーロン設定を、まとめる形で紹介していきます
実際の業務でクーロンの設定をおこなう際、“あれ?あの設定でどうやるんだっけ?”というときに役立つTIPS集としてまとめます。


何か思いだしたら都度追記していきます。


クーロン設定の基本


まずは設定の基本を紹介します。
クーロン設定は以下の書式になります。

分  時  日  月  曜日 ユーザ名  コマンド

0分から59分までを定義

0時から23時までを定義

1日から31日までを定義

1月から12月までを定義。英字略形も可(jan,feb…dec)

曜日

0から7までを定義。0が日曜。英字略形も可(sun,mon…sat)


各定義について、リスト定義と範囲体後のどちらも可能です。

リスト

1,5,10

指定した値の場合のみ実行

範囲

1-5

指定した値の範囲内であれば実行

共存

1,5,10-15

リストと範囲の混在定義

間隔

1-5/2

「/」の後に間隔値を定義。左記の例だと「1,3,5」


月末に1回だけ動くクーロン設定


“月末に1回だけ動く”といったクーロン設定について紹介します。

結論を先に言いますと、以下の設定でOKです。


59 23 28-31 * * root   /usr/bin/test `date -d tomorrow +\%d` -eq 1 && sh /home/root/sample.sh

これで、”月末に1回だけ動く”というクーロン設定になります。

各設定の詳細について説明してきます。

前半部分が「月末」の定義です。

59 23 28-31 の部分ですね。


毎月、28日、29日、30日、31日の、23時59分にクーロンを動かせる設定になります。
でもこのままだと、月末に1回だけではなく、最大4回動いてしまいます。

なので、次の日が”1日”だったらという条件を追加します。
つまり、3月だと3月31日の次の日が1日(4月1日)だったら月末、
9月だと9月30日の次の日が1日(10月1日)だったら月末、という事ですね。


その計算が、/usr/bin/test `date -d tomorrow +\%d` -eq 1 &&  です。


testコマンドで条件を記述しています。
「date -d tomorrow +\%d」の返り値が1だったら月末と判定します。


この条件を28日から31日に動かすことによって、月末1回動作します。


標準出力をさせない設定


クーロンで実行したプログラムの実行結果が標準出力されることを防ぐためには、クーロン設定の末尾に標準出力を無しにする記述をおこないます。

55 23 28-31 * * root   /usr/bin/test `date -d tomorrow +\%d` -eq 1 && sh /home/root/sample.sh > /dev/null 2>&1

標準出力をなし(NULL)にします。
これで、標準出力はおこなわれません。



cpコマンド(コピー)の使い方。覚えておくと便利なオプションも解説。

Linux

前回、lsコマンドの使い方、覚えておくと便利なオプションについて紹介させてもらいました。



今回は、コピーコマンドについて紹介していきます。
コピーコマンドについても、Linuxで作業をおこなう上では必須のコマンドになります。
こちらもまた、使わない人はいないでしょう。


メジャーなオプションからマイナーなオプションまで、いろいろ説明していきます。


頻繁に使うコマンドなのであまり忘れることはないオプションが多いかもしれませんが、参考にしてください。


同名ファイルが存在する場合はバックアップ作成(-b)


コピー先に同名ファイルが存在する場合、バックアップファイルを作成します。
「-b」オプションを使用します。


$ ls -la
total 16
drwxr-xr-x 2 xxx yyy 4096 2020-01-29 01:31 .
drwxr-xr-x 5 xxx yyy 4096 2019-07-28 23:49 ..
-rw-r--r-- 1 xxx yyy    5 2020-01-29 01:31 dest.txt
-rw-r--r-- 1 xxx yyy    4 2020-01-29 01:31 src.txt
$ cp -b src.txt dest.txt
$ ls -la
total 20
drwxr-xr-x 2 xxx yyy 4096 2020-01-29 01:31 .
drwxr-xr-x 5 xxx yyy 4096 2019-07-28 23:49 ..
-rw-r--r-- 1 xxx yyy    4 2020-01-29 01:31 dest.txt
-rw-r--r-- 1 xxx yyy    5 2020-01-29 01:31 dest.txt~
-rw-r--r-- 1 xxx yyy    4 2020-01-29 01:31 src.txt

上記コマンド結果のようになります。
コピー先に既に「dest.txt」というファイルが既に存在するので、コピー先に存在していた「dest.txt」をバックアップファイルとして退避しています。


強制上書き(-f)


OS自体の設定にもよりますが、ファイルをコピーすると上書きになる場合、「上書きします。よろしいですか?」のメッセージが表示されます。
「-f」オプション、または、「–force」オプションを使用すると、この上書き確認メッセージを表示しません。


$ ls -la
total 12
drwxr-xr-x 2 xxx yyy 4096 2020-01-29 01:34 .
drwxr-xr-x 5 xxx yyy 4096 2020-01-29 01:36 ..
-rw-r--r-- 1 xxx yyy    0 2020-01-29 01:36 dest.txt
-rw-r--r-- 1 xxx yyy    4 2020-01-29 01:34 src.txt
$ cp -f src.txt dest.txt
$ ls -la
total 16
drwxr-xr-x 2 xxx yyy 4096 2020-01-29 01:34 .
drwxr-xr-x 5 xxx yyy 4096 2020-01-29 01:36 ..
-rw-r--r-- 1 xxx yyy    4 2020-01-29 01:43 dest.txt
-rw-r--r-- 1 xxx yyy    4 2020-01-29 01:34 src.txt

上記コマンド結果のように、同じファイル名でコピーしたとしても、上書き確認メッセージは表示されません。


必ず上書き確認メッセージを表示(-i)


先ほどの強制上書きでも記載しましたが、「上書きします。よろしいですか?」のメッセージが表示されるかどうかは、OS自体の設定に依存します。
「-i」オプション、または、「–interactive」オプションを使用すると、上書き確認メッセージを必ず表示することができます。


$ ls -la
total 12
drwxr-xr-x 2 xxx yyy 4096 2020-01-29 01:49 .
drwxr-xr-x 5 xxx yyy 4096 2020-01-29 01:36 ..
-rw-r--r-- 1 xxx yyy    4 2020-01-29 01:43 dest.txt
-rw-r--r-- 1 xxx yyy    0 2020-01-29 01:49 src.txt
$ cp -i dest.txt src.txt
cp: overwrite `src.txt'? yes
$ ls -la
total 16
drwxr-xr-x 2 xxx yyy 4096 2020-01-29 01:49 .
drwxr-xr-x 5 xxx yyy 4096 2020-01-29 01:36 ..
-rw-r--r-- 1 xxx yyy    4 2020-01-29 01:43 dest.txt
-rw-r--r-- 1 xxx yyy    4 2020-01-29 01:49 src.txt

上記コマンド結果のように、上書きコピー時に「 overwrite `src.txt’?」という確認メッセージを表示しています。
yesと入力すると、ファイルが上書き更新されます。


同名ファイルの場合は上書きしない(-n)


同名ファイルを上書きしたくない場合は、「-n」オプション、または、「–no-clobber」オプションを指定すると、上書きは行われません。


$ ls -la
total 12
drwxr-xr-x 2 xxx yyy 4096 2020-01-29 02:08 .
drwxr-xr-x 5 xxx yyy 4096 2020-01-29 01:36 ..
-rw-r--r-- 1 xxx yyy    4 2020-01-29 01:43 dest.txt
-rw-r--r-- 1 xxx yyy    0 2020-01-29 02:04 src.txt
$ cp -n dest.txt src.txt
$ ls -la
total 12
drwxr-xr-x 2 xxx yyy 4096 2020-01-29 02:08 .
drwxr-xr-x 5 xxx yyy 4096 2020-01-29 01:36 ..
-rw-r--r-- 1 xxx yyy    4 2020-01-29 01:43 dest.txt
-rw-r--r-- 1 xxx yyy    0 2020-01-29 02:04 src.txt

属性情報(タイムスタンプなど)をそのままにしてコピー(-p)


タイムスタンプ・グループ・所有者といった属性情報はそのままにしてコピーする場合は「-p」オプション、または、「–preserve」オプションを指定します。


$ ls -la
total 16
drwxr-xr-x 2 xxx yyy 4096 2020-02-05 00:35 .
drwxr-xr-x 5 xxx yyy 4096 2020-01-29 01:36 ..
-rw-r--r-- 1 xxx yyy    4 2020-02-05 00:38 dest.txt
-rw-r--r-- 1 xxx yyy    4 2020-01-29 01:43 src.txt
$ cp -p src.txt dest.txt
$ ls -la
total 16
drwxr-xr-x 2 xxx yyy 4096 2020-02-05 00:35 .
drwxr-xr-x 5 xxx yyy 4096 2020-01-29 01:36 ..
-rw-r--r-- 1 xxx yyy    4 2020-01-29 01:43 dest.txt
-rw-r--r-- 1 xxx yyy    4 2020-01-29 01:43 src.txt

フォルダをコピー/再帰的にコピー(-r)


フォルダをコピーする場合は「-r」オプションを指定します。

このオプションを指定すれば、フォルダの中身がそのまま表示されます。

フォルダをコピーというよりも、フォルダの中身を再帰的にコピーするという動きになります。


$ ls -la
total 12
drwxr-xr-x 3 xxx yyy 4096 2020-02-05 00:49 .
drwxr-xr-x 8 xxx yyy 4096 2019-09-10 01:01 ..
drwxr-xr-x 2 xxx yyy 4096 2020-02-05 00:35 dir
$
$
$ ls -la ./dir/
total 16
drwxr-xr-x 2 xxx yyy 4096 2020-02-05 00:35 .
drwxr-xr-x 3 xxx yyy 4096 2020-02-05 00:49 ..
-rw-r--r-- 1 xxx yyy    4 2020-02-05 00:40 dest.txt
-rw-r--r-- 1 xxx yyy    4 2020-01-29 01:43 src.txt
$ cp -r dir dir2
$ ls -la
total 16
drwxr-xr-x 4 xxx yyy 4096 2020-02-05 00:50 .
drwxr-xr-x 8 xxx yyy 4096 2019-09-10 01:01 ..
drwxr-xr-x 2 xxx yyy 4096 2020-02-05 00:35 dir
drwxr-xr-x 2 xxx yyy 4096 2020-02-05 00:50 dir2
$ ls -la ./dir2/
total 16
drwxr-xr-x 2 xxx yyy 4096 2020-02-05 00:50 .
drwxr-xr-x 4 xxx yyy 4096 2020-02-05 00:50 ..
-rw-r--r-- 1 xxx yyy    4 2020-02-05 00:50 dest.txt
-rw-r--r-- 1 xxx yyy    4 2020-02-05 00:50 src.txt


lsコマンドの使い方。覚えておくと便利なオプションも解説。

Linux

Linuxで作業をおこなう上では、lsコマンドは必須のコマンドになります。
使わない人はいないでしょう。


しかし、「-l」とか「-a」といった超メジャーなオプションのみを使っており、便利なオプションを使いこなしていない人が多いように思います。
今回は、lsコマンドのオプションについて、知っていればちょっと便利なオプションについて紹介していきます。


そもそもですが、lsは「ListSegment」の略です。
日本語では、”セグメントをリスト表示する”でしょうか。


lsコマンドだけ実行すると、カレントディレクトリに存在するファイルやフォルダの一覧を表示します。

$ ls
aaa.txt  folder

q


カレントディレクトリではなく、一覧を表示したいフォルダを指定すれば、指定したフォルダ配下の一覧を表示します。

$ ls  ./folder/
folder2  xyz.txt

以下から各オプションについて説明していくのですが、オプションを複数指定したい場合は、ハイフン(-)の後に使用したいオプションを連続して指定すればよいです。
「-l」と「-a」オプションを同時に使用したい場合は、「ls -la」と記述する、といった感じです。


全部表示する(-a,-A)


全てのファイルを表示する場合は「-a」オプションです。
もしくは「-all」。
通常は表示されない、先頭にピリオド「.」が付くファイルも表示します。
カレントを表現する「.」と、一つ上階層を表現する「..」も表示します。


$ ls -a
.  ..  .env.sh  aaa.txt  folder

小文字の「a」ではなく大文字の「A」を使用すると、「.」「..」は除外された形で表示されます。
もしくは「–almost-all」。


$ ls -A
.env.sh  aaa.txt  folder

バックアップファイルを表示しない(-B)


linuxが生成するバックアップファイルには、末尾に”~”(チルダ)が付きます。
このバックアップをファイルを表示したくない場合は「-B」オプションを使用します。
もしくは「–ignore-backups」。


1.「-B」を付けない場合

$ ls
aaa.txt  bbb.txt  ccc.txt  ccc.txt~  folder

2.「-B」を付けた場合

$ ls -B
aaa.txt  bbb.txt  ccc.txt  folder

出力時の色を指定する(–color)


出力時の表示色を指定する場合は「–color[=WHEN]」を指定します。
WHENには、’auto”always”never’の3パターンが指定できます。
デフォルトは’auto’です。


1.’auto’を使用。

$ ls -l --color=auto

環境設定に定義されている色に従って、表示結果の色付けをおこないます。
環境設定に定義されている表示色は、「$ dircolors -p」で確認できます。


$ dircolors -p
DIR 01;34 # directory
LINK 01;36 # symbolic link. (If you set this to 'target' instead of a

2.’always’を使用

$ ls -l --color=always

常に色表示を有効にします。
例えば、ls の結果をパイプで繋いで絞り込んだ場合、色指定が消えてしまうときがあります。
これを防ぎます。
常に環境変数に定義されている色指定を有効にします。


3.’never’を使用

$ ls -l --color=never

色表示を行いません。


ディレクトリのみを表示する(-d)


ディレクトリのみを表示する場合は「-d」オプションです。
もしくは「–directory」。


正確には、ディレクトリのみを表示する場合は「-d」オプションを付けるだけではなく、もう一工夫が必要です。
以下のようにします。
カレントディレクト配下のディレクトリのみを表示する場合です。


$ ls -d */
folder1/  folder2/

様々なソート方法


ファイル・ディレクトリのソートについて、様々なソートをおこなうことができます。


1.ディレクトリ昇順でソート(-f)

「ディレクトリ昇順」とは、Linuxのファイルシステムが設定する順番です。
なので、ソートせずに表示していることと同等となります。


$ ls -f
.  folder1  xyz.txt  ..  folder2

2.逆ソート(-r)

ソート順を逆にしてソートをおこないます。
「-r」もしくは「–reverse」になります。


$ ls
aaa.txt  bbb.txt  ccc.txt  ccc.txt~  folder  link
$ ls --reverse
link  folder  ccc.txt~  ccc.txt  bbb.txt  aaa.txt

3.ファイルサイズでソート(-S)

ファイルサイズの降順でソートをおこないます。


$ ls -lS
total 20
drwxr-xr-x 4 xxx yyy 4096 2020-01-05 01:26 folder
lrwxrwxrwx 1 xxx yyy   41 2020-01-05 20:41 link -> /home/users/0/oops.jp-sakusaku/ls/aaa.txt
-rw-r--r-- 1 xxx yyy   20 2020-01-05 00:27 bbb.txt
-rw-r--r-- 1 xxx yyy   20 2020-01-05 00:27 ccc.txt~
-rw-r--r-- 1 xxx yyy   12 2020-01-05 00:26 aaa.txt
-rw-r--r-- 1 xxx yyy   12 2020-01-05 00:28 ccc.txt

4.更新日時でソート(-t)

更新日時の降順でソートをおこないます。


$ ls -lt
total 20
lrwxrwxrwx 1 oops.jp-sakusaku LolipopUser   41 2020-01-05 20:41 link -> /home/users/0/oops.jp-sakusaku/ls/aaa.txt
drwxr-xr-x 4 oops.jp-sakusaku LolipopUser 4096 2020-01-05 01:26 folder
-rw-r--r-- 1 oops.jp-sakusaku LolipopUser   12 2020-01-05 00:28 ccc.txt
-rw-r--r-- 1 oops.jp-sakusaku LolipopUser   20 2020-01-05 00:27 ccc.txt~
-rw-r--r-- 1 oops.jp-sakusaku LolipopUser   20 2020-01-05 00:27 bbb.txt
-rw-r--r-- 1 oops.jp-sakusaku LolipopUser   12 2020-01-05 00:26 aaa.txt

5.アクセス日時でソート(-u)

アクセス日時の降順でソートをおこないます。


$ ls -lu
total 20
-rw-r--r-- 1 xxx yyy   12 2020-01-05 00:28 aaa.txt
-rw-r--r-- 1 xxx yyy   20 2020-01-05 00:27 bbb.txt
-rw-r--r-- 1 xxx yyy   12 2020-01-05 17:06 ccc.txt
-rw-r--r-- 1 xxx yyy   20 2020-01-05 17:06 ccc.txt~
drwxr-xr-x 4 xxx yyy 4096 2020-01-12 12:02 folder
lrwxrwxrwx 1 xxx yyy   41 2020-01-12 12:02 link -> /home/users/0/oops.jp-sakusaku/ls/aaa.txt

6.ファイルの拡張子でソート(-X)

ファイルの拡張子でソートをおこないます。
拡張子のアルファベット順になります。


$ ls -lX
total 20
drwxr-xr-x 4 xxx yyy 4096 2020-01-05 01:26 folder
lrwxrwxrwx 1 xxx yyy   41 2020-01-05 20:41 link -> /home/users/0/oops.jp-sakusaku/ls/aaa.txt
-rw-r--r-- 1 xxx yyy    0 2020-01-12 14:19 aaa.exe
-rw-r--r-- 1 xxx yyy   12 2020-01-05 00:26 aaa.txt
-rw-r--r-- 1 xxx yyy   20 2020-01-05 00:27 bbb.txt
-rw-r--r-- 1 xxx yyy   12 2020-01-05 00:28 ccc.txt
-rw-r--r-- 1 xxx yyy   20 2020-01-05 00:27 ccc.txt~

ファイルタイムスタンプを秒まで表示(–full-time)


通常、ファイルのタイムスタンプは分までしか表示されないですが、秒まで表示することもできます。
「–full-time」を指定します。


$ ls --full-time
total 20
-rw-r--r-- 1 xxx yyy   12 2020-01-05 00:26:52.42195666 +0900 aaa.txt
-rw-r--r-- 1 xxx yyy   20 2020-01-05 00:27:28.51452186 +0900 bbb.txt
-rw-r--r-- 1 xxx yyy   12 2020-01-05 00:28:28.96779361 +0900 ccc.txt
-rw-r--r-- 1 xxx yyy   20 2020-01-05 00:27:47.82928918 +0900 ccc.txt~
drwxr-xr-x 4 xxx yyy 4096 2020-01-05 01:26:07.22816214 +0900 folder

オーナーを表示しない(-g)、グループを表示しない(-G)


通常は、オーナーとグループが表示されますが、それぞれを表示しない出力も可能です。

オーナーを表示したくない場合は「-g」オプションを指定します。


$ ls -la
total 20
-rw-r--r-- 1 yyy   12 2020-01-05 00:26 aaa.txt
-rw-r--r-- 1 yyy   20 2020-01-05 00:27 bbb.txt
-rw-r--r-- 1 yyy   12 2020-01-05 00:28 ccc.txt
-rw-r--r-- 1 yyy   20 2020-01-05 00:27 ccc.txt~
drwxr-xr-x 4 yyy 4096 2020-01-05 01:26 folder

グループを表示したくない場合は「-G」オプションを指定します。
もしくは「–no-group」。


$ ls -lG
total 20
-rw-r--r-- 1 xxx   12 2020-01-05 00:26 aaa.txt
-rw-r--r-- 1 xxx   20 2020-01-05 00:27 bbb.txt
-rw-r--r-- 1 xxx   12 2020-01-05 00:28 ccc.txt
-rw-r--r-- 1 xxx   20 2020-01-05 00:27 ccc.txt~
drwxr-xr-x 4 xxx 4096 2020-01-05 01:26 folder

また、オーナーのみを表示したい場合は「-o」オプションを指定でもOKです。


$ ls -o
total 20
-rw-r--r-- 1 xxx   12 2020-01-05 00:26 aaa.txt
-rw-r--r-- 1 xxx   20 2020-01-05 00:27 bbb.txt
-rw-r--r-- 1 xxx   12 2020-01-05 00:28 ccc.txt
-rw-r--r-- 1 xxx   20 2020-01-05 00:27 ccc.txt~
drwxr-xr-x 4 xxx 4096 2020-01-05 01:26 folder
lrwxrwxrwx 1 xxx   41 2020-01-05 20:41 link -> /home/users/0/oops.jp-sakusaku/ls/aaa.txt

1024の累乗ではなく100の累乗でサイズ表示する(–si)


通常、1024の累乗でファイル表示をおこないますが、1000の累乗でサイズ表示。


1.1024の累乗

$ ls -la
total 28
drwxr-xr-x 3 xxx yyy 4096 2020-01-05 00:28 .
drwx-----x 6 xxx yyy 4096 2020-01-05 00:27 ..
-rw-r--r-- 1 xxx yyy    0 2019-11-19 01:28 .env.sh
-rw-r--r-- 1 xxx yyy   12 2020-01-05 00:26 aaa.txt
-rw-r--r-- 1 xxx yyy   20 2020-01-05 00:27 bbb.txt
-rw-r--r-- 1 xxx yyy   12 2020-01-05 00:28 ccc.txt
-rw-r--r-- 1 xxx yyy   20 2020-01-05 00:27 ccc.txt~
drwxr-xr-x 4 xxx yyy 4096 2020-01-05 01:26 folder

2.1000の累乗

$ ls -la --si
total 29k
drwxr-xr-x 3 xxx yyy 4.1k 2020-01-05 00:28 .
drwx-----x 6 xxx yyy 4.1k 2020-01-05 00:27 ..
-rw-r--r-- 1 xxx yyy    0 2019-11-19 01:28 .env.sh
-rw-r--r-- 1 xxx yyy   12 2020-01-05 00:26 aaa.txt
-rw-r--r-- 1 xxx yyy   20 2020-01-05 00:27 bbb.txt
-rw-r--r-- 1 xxx yyy   12 2020-01-05 00:28 ccc.txt
-rw-r--r-- 1 xxx yyy   20 2020-01-05 00:27 ccc.txt~
drwxr-xr-x 4 xxx yyy 4.1k 2020-01-05 01:26 folder

ファイルのインデックス番号を表示する(-i)


Linuxにファイルに付与しているインデックス番号を表示することができます。
「-i」もしくは「–inode」になります。


$ ls -li
total 20
25566879 -rw-r--r-- 1 xxx yyy   12 2020-01-05 00:26 aaa.txt
25566875 -rw-r--r-- 1 xxx yyy   20 2020-01-05 00:27 bbb.txt
25566878 -rw-r--r-- 1 xxx yyy   12 2020-01-05 00:28 ccc.txt
25566868 -rw-r--r-- 1 xxx yyy   20 2020-01-05 00:27 ccc.txt~
25566958 drwxr-xr-x 4 xxx yyy 4096 2020-01-05 01:26 folder
25559629 lrwxrwxrwx 1 xxx yyy   41 2020-01-05 20:41 link -> /home/users/0/oops.jp-sakusaku/ls/aaa.txt

リスト形式で表示する(-l)


ファイル名のみの表示ではなく、オーナー・グループ・サイズといったファイルの属性情報を含めてリスト形式で表示します。


$ ls -l
total 20
-rw-r--r-- 1 xxx yyy   12 2020-01-05 00:26 aaa.txt
-rw-r--r-- 1 xxx yyy   20 2020-01-05 00:27 bbb.txt
-rw-r--r-- 1 xxx yyy   12 2020-01-05 00:28 ccc.txt
-rw-r--r-- 1 xxx yyy   20 2020-01-05 00:27 ccc.txt~
drwxr-xr-x 4 xxx yyy 4096 2020-01-05 01:26 folder
lrwxrwxrwx 1 xxx yyy   41 2020-01-05 20:41 link -> /home/users/0/oops.jp-sakusaku/ls/aaa.txt

キロバイトでファイルサイズを表示する(-k)


ファイルサイズをバイト表示ではなく、キロバイト表示します。


$ ls -lk
total 20
-rw-r--r-- 1 xxx yyy 1 2020-01-05 00:26 aaa.txt
-rw-r--r-- 1 xxx yyy 1 2020-01-05 00:27 bbb.txt
-rw-r--r-- 1 xxx yyy 1 2020-01-05 00:28 ccc.txt
-rw-r--r-- 1 xxx yyy 1 2020-01-05 00:27 ccc.txt~
drwxr-xr-x 4 xxx yyy 4 2020-01-05 01:26 folder
lrwxrwxrwx 1 xxx yyy 1 2020-01-05 20:41 link -> /home/users/0/oops.jp-sakusaku/ls/aaa.txt

シンボリックリンクはリンク先パスを表示しない(-L)


シンボリックリンクのリンク先パスを表示したくない場合は「-L」オプションを使用します。


$ ls -lL
total 24
-rw-r--r-- 1 xxx yyy   12 2020-01-05 00:26 aaa.txt
-rw-r--r-- 1 xxx yyy   20 2020-01-05 00:27 bbb.txt
-rw-r--r-- 1 xxx yyy   12 2020-01-05 00:28 ccc.txt
-rw-r--r-- 1 xxx yyy   20 2020-01-05 00:27 ccc.txt~
drwxr-xr-x 4 xxx yyy 4096 2020-01-05 01:26 folder
-rw-r--r-- 1 xxx yyy   12 2020-01-05 00:26 link

ファイルリストをカンマ区切りで表示する(-m)


ファイルリストをカンマ区切りで表示することができます。
「-m」オプションです。
出力結果を加工する際に便利です。


$ ls -m
aaa.txt, bbb.txt, ccc.txt, ccc.txt~, folder, link

オーナーとグループを文字列ではなくID表示(-n)


オーナーとグループはID(数値)をもっています。
「-n」オプションを使用すると、ID表示をおこなうことができます。


$ ls -n
total 20
-rw-r--r-- 1 1421071 1000   12 2020-01-05 00:26 aaa.txt
-rw-r--r-- 1 1421071 1000   20 2020-01-05 00:27 bbb.txt
-rw-r--r-- 1 1421071 1000   12 2020-01-05 00:28 ccc.txt
-rw-r--r-- 1 1421071 1000   20 2020-01-05 00:27 ccc.txt~
drwxr-xr-x 4 1421071 1000 4096 2020-01-05 01:26 folder
lrwxrwxrwx 1 1421071 1000   41 2020-01-05 20:41 link -> /home/users/0/oops.jp-sakusaku/ls/aaa.txt

ダブルクォーテーションでファイル名を囲む(-Q)


ファイル名をダブルクォーテーションで囲むことができます。
「-Q」もしくは「–quote-name」になります。


$ ls -Q
"aaa.txt"  "bbb.txt"  "ccc.txt"  "ccc.txt~"  "folder"  "link"

再帰的にlsコマンドを実施(-R)


lsコマンドを実施するフォルダの中に存在するフォルダに対してもlsコマンドを実行し、再帰的に結果を表示します。
「-R」もしくは「–recursive」になります。


「再帰的」に結果を表示するので、フォルダの中にフォルダ(フォルダがネスト)が存在していて、全てのファイルを一覧表示する時に便利です。


$ ls -lR
.:
total 20
-rw-r--r-- 1 xxx yyy   12 2020-01-05 00:26 aaa.txt
-rw-r--r-- 1 xxx yyy   20 2020-01-05 00:27 bbb.txt
-rw-r--r-- 1 xxx yyy   12 2020-01-05 00:28 ccc.txt
-rw-r--r-- 1 xxx yyy   20 2020-01-05 00:27 ccc.txt~
drwxr-xr-x 4 xxx yyy 4096 2020-01-05 01:26 folder
lrwxrwxrwx 1 xxx yyy   41 2020-01-05 20:41 link -> /home/users/0/oops.jp-sakusaku/ls/aaa.txt

./folder:
total 8
drwxr-xr-x 2 xxx yyy 4096 2020-01-05 01:26 folder1
drwxr-xr-x 2 xxx yyy 4096 2019-11-19 01:13 folder2
-rw-r--r-- 1 xxx yyy    0 2019-11-19 01:13 xyz.txt

./folder/folder1:
total 0

./folder/folder2:
total 0

ファイル名だけを行表示(-1)


あんまり知っている人が少ないかと思いますが、ファイル名だけを表示することができます。
「-1」オプションになります。


$ ls -1
aaa.exe
aaa.txt
bbb.txt
ccc.txt
ccc.txt~
folder
link


MySQLデータのインポートとエクスポート!圧縮と解凍する方法を紹介

Linux

こんにちは。
さくさくTECHブロガーのさくです。


今回は、Linux + MySQL の環境において、シェルを使ってエクスポートとインポートをおこなう方法を紹介します。


どういった場面を想定しているかといいますと、一番は定期実行のバッチですね。
例えば、1日1回、特定テーブルのデータをエクスポートする、といった要件があった場合。


その場合、エクスポートするコマンドをシェル化してクーロンに設定すると思います。
そういった時に使える手法です。


インポートについては、例えば実データが壊れてしまった場合の復旧ですね。
エクスポートしたデータをインポートすれば、データは元通りになります。


環境情報


OS:Linux
DB:MySQL


MySQLには「saku」というDBを準備します。
そのDBには「person」というテーブルが存在します。
テーブル構成は以下。


mysql> desc person;
+----------+--------------+------+-----+---------+----------------+
| Field    | Type         | Null | Key | Default | Extra          |
+----------+--------------+------+-----+---------+----------------+
| personID | int(11)      | NO   | PRI | NULL    | auto_increment |
| name     | varchar(32)  | NO   | MUL | NULL    |                |
| kana     | varchar(128) | NO   |     | NULL    |                |
| address  | varchar(512) | YES  |     | NULL    |                |
| gender   | char(1)      | NO   |     | NULL    |                |
+----------+--------------+------+-----+---------+----------------+
5 rows in set (0.00 sec)

また、あらかじめデータも格納しておきます。

mysql> select * from person;
+----------+--------+--------------+-----------+--------+
| personID | name   | kana         | address   | gender |
+----------+--------+--------------+-----------+--------+
|        4 | 山田   | ヤマダ       | 東京      | 0      |
|        5 | 高橋   | タカハシ     | 神奈川    | 0      |
|        6 | 田中   | タナカ       | 千葉      | 1      |
+----------+--------+--------------+-----------+--------+
3 rows in set (0.00 sec)

このテーブルに対して、エクスポート、および、インポートをおこないます。


エクスポート

まずはエクスポート。
エクスポートする条件も指定します。
「gender」が「1」のレコードのみをエクスポートします。
シェルは以下になります。

#!/bin/sh
# 
# エクスポートシェル
# 
mysqldump -h localhost \--single-transaction --skip-opt --extended-insert --quick --set-charset --no-create-info --no-autocommit \
  -u ※ユーザ名 -p※パスワード -h ※ホスト名 ※DB名 person \
  --where="gender = '0'" \
  | gzip > person.sql.gz 2>&1 | tee -a export.log

使用するコマンドは mysqldump コマンドです。
mysqldump コマンドで、「gender」が「1」のレコードのみをエクスポートします。
かつ、エクスポートするファイルはperson.sql.gzという圧縮ファイルとして出力し、エクスポート時のログをexport.logに出力します。


エクスポート結果を圧縮することで、仮に大量データをエクスポートすることになったとしても、ある程度はディスク使用率おさえることができます。


様々なオプションを指定していますが、各オプションの用途は以下になります。


オプション

説明

–single-transaction

これを設定しておくと、InnoDBについてエクスポートする際、他SQLがロックされないです。運用中システムについてエクスポートする際は、このオプションを指定した方が無難。

–skip-opt

「–opt」の設定をオフにします。

「–opt」の設定の中に「–add-locks」がありますが、これが有効だとエクスポート中にテーブルがロックされてしまう可能性があります。

それを防ぐために、–skip-optを設定して、「–opt」の設定をオフにします。

–extended-insert

出力されるダンプファイルについて、バルクインサートの形でSQLを作成します。

–quick

MySQLのマニュアルをみる限りでは、大量データをエクスポートする際はつけた方がいいみたいです。意味を理解しきれませんでしたが、たぶん、メモリ上にエクスポートデータを展開するタイミングの話のようです。このオプションを指定した方が、より高速なやり方を実施するようです。

–set-charset

出力するエクスポートするファイルに SET NAMES default_character_set を出力します。

–no-create-info

エクスポートするファイルに CREATE文を出力しません。

–no-autocommit

エクスポートするファイルに AutoCommitをオフにします。

具体的には、エクスポートするファイルのSQL先頭に「set autocommit=0;」を出力します。

かつ、最後に「commit;」を出力します。


エクスポートはこんな感じです。
エクスポートが完了するとperson.sql.gzというファイルが作成されます。


インポート


次にインポート。
インポートは、エクスポートシェルで作成したperson.sql.gzを解凍して、解凍したファイルを参照してインポートします。


シェルは以下になります。

#!/bin/sh
# 
# インポートシェル
# 
gunzip -d person.sql.gz >> insert.sql
mysql -u ※ユーザ名 -h ※ホスト名 -D ※DB名 -p※パスワード < insert.sql 2>&1 \ | tee -a import.log

まずは guzip コマンドで解凍して、「insert.sql」を出力。
gunzipに-d オプションをつけているので、元ファイルの「person.sql.gz」を削除して「insert.sql」に解凍結果を出力。


インポート自体はmysqlコマンドで実行しています。
リダイレクト「<」を指定して、解凍したSQLファイルをそのままインポートします。


まとめ


いかがでしたでしょうか?


今回はたった3行しか入っていないテーブルに対してのエクスポートなので性能は意識する必要はないのですが、数億件のエクスポートする場合は性能が大事になります。
紹介したオプションを指定すれば、極力、サーバ性能に沿ったパフォーマンスを出せると思っています
参考にしてください。


それではまた!