私的linux逆引きリファレンス

目次

2つのファイルの内容が同じかどうかを確認するには?

cmp -s コマンドを使用すると、2 つのファイルをバイト単位で比較し、内容が同じであれば何も表示せず終了ステータス 0 を返します。内容が異なる場合も何も表示せず終了ステータス 1 を返し、何らかの問題が発生した場合には終了ステータス 2 を返します。

以下は cmp -s コマンドの使用例です:

1$ cmp -s <(echo -e "a\nb") <(echo -e "a\nb"); echo $?
20
3$ cmp -s <(echo -e "a\nb") <(echo -e "a\nb\n"); echo $?
41

最初のコマンドでは、両ファイルの内容が同じため終了ステータスが 0 になります。2番目のコマンドでは、ファイルの内容が異なるため終了ステータスが 1 になります。

2つのファイルを比較して、それぞれのファイルに特有の行や共通する行を確認するには?

comm コマンドは、2つのソート済みファイルを比較し、共通の行とそれぞれのファイルにのみ存在する行を表示します。デフォルトでは、3列の出力が得られます。具体例として、次のコマンドを使用すると、ファイル内容が次のように表示されます:

1$ comm <(echo -e "a\nb\nc\nd") <(echo -e "B\nc")
2    B
3a
4b
5        c
6d

この出力では、第 1 列には FILE1 のみに含まれる行(a, b, d)、第 2 列には FILE2 のみに含まれる行(B)、第 3 列には両方のファイルに共通する行(c)が表示されます。

特定の列を表示しないようにするには、次のオプションを使用します:

  • -1:第 1 列の出力をしない。
  • -2:第 2 列の出力をしない。
  • -3:第 3 列の出力をしない。

例えば、第 1 列と第 2 列を表示せず、大文字と小文字を区別せずに行を比較するには、次のコマンドを使用します:

1$ comm -1 -2 -i <(echo -e "a\nb\nc\nd") <(echo -e "B\nc")
2b
3c

このコマンドでは、-1-2 オプションで第 1 列と第 2 列が表示されず、-i オプションにより大文字と小文字が区別されないため、bc だけが出力されます。

ファイルコピー時に保存先ファイルを強制的に上書きするには?

cp コマンドの -f オプションは、保存先のファイルが開けない場合に、そのファイルを削除し、パーミッションに関係なく確認を求めずに新しいファイルを作成します。このオプションは、以前に指定された -n オプションを上書きします。また、コピー前にターゲットファイルのリンクが解除されることはなく、既存のアクセス権はすべて保持されます。

例えば、次のコマンドは source.txtdestination.txt にコピーしますが、destination.txt が存在しアクセスできない場合、ファイルを削除して新しいファイルを作成します:

1$ cp -f source.txt destination.txt

このコマンドでは、destination.txt が存在していても、アクセス権に関係なく確認なしで強制的に上書きされます。

テキストファイルの各行から特定のバイト位置や文字位置、またはフィールドを抽出して表示するには?

cut コマンドを使用して、行から特定の部分を切り出すことができます。具体的には以下のオプションがあります:

  • バイト位置を表示するには、-b オプションを使用します。例えば、次のコマンドは各行から2番目のバイトを表示します:

    1$ cut -b 2 <(echo "abcde")
    2b
    
  • 文字位置を表示するには、-c オプションを使用します。例えば、次のコマンドは日本語の文字列から2番目の文字を表示します:

    1$ echo "こんにちは" | cut -c 2
    2
  • フィールドだけを表示するには、-f オプションを使用します。デフォルトではTABがフィールド区切り文字として使用されますが、区切り文字を変更するには -d オプションを併用します。例えば、次のコマンドはスペースをフィールド区切り文字として使用し、2番目のフィールドを表示します:

    1$ echo "a b c d e" | cut -f 2 -d ' '
    2b
    

任意のサイズのファイルを作成するためには?

dd コマンドを使用すると、任意のサイズのファイルを作成することができます。このコマンドは、ファイルの変換とコピーを行います。具体的には、if オプションで指定した入力ファイルからデータを読み込み、of オプションで指定した出力ファイルに書き込みます。bs オプションでブロックサイズを指定し、count オプションで読み込むブロックの数を指定します。

例えば、7MB のNULLファイルを作成するには、次のコマンドを使用します:

1$ dd if=/dev/zero of=null_7MB bs=1M count=7

このコマンドでは、/dev/zero から 1MB 単位で 7 回読み込み、null_7MB という名前のファイルに書き込みます。出力結果として、ファイルサイズが 7340032 バイトであることが確認できます。

また、20 バイトのランダムデータファイルを作成するには、次のコマンドを使用します:

1$ dd if=/dev/urandom of=my_random bs=1 count=20

このコマンドでは、/dev/urandom から 1 バイト単位で 20 回読み込み、my_random という名前のファイルに書き込みます。出力結果として、20 バイトのランダムデータが生成されることが確認できます。生成されたファイルの内容を base64 形式で表示するには、次のコマンドを使用します:

1$ cat my_random | base64

ファイルやディレクトリを再帰的に比較するには?

diff コマンドの -r オプションを使用することで、見つかった共通のサブディレクトリに対しても diff を再帰的に適用し、ディレクトリ内のファイルも含めて比較することができます。例えば、次のコマンドはディレクトリ dir1dir2 を再帰的に比較します:

1$ diff -r dir1 dir2

このコマンドは dir1dir2 内の全てのファイルとサブディレクトリを比較し、その違いを表示します。

2つのファイルを比較して、内容が同じ場合にもその結果を報告するには?

diff コマンドの -s オプションを使用することで、2つのファイルが同じであった場合にも、その旨を報告することができます。例えば、次のコマンドは file1.txtfile2.txt の内容を比較し、同じであればその旨を報告します:

1$ diff -s file1.txt file2.txt
2ファイル file1.txt と file2.txt は同一です

このコマンドは、両ファイルが同一であることを示すメッセージを出力します。

ディレクトリの比較時に特定のファイルやサブディレクトリを比較対象から除外するには?

diff コマンドの -x オプションを使用することで、ベースネームが指定したパターンに一致するファイルやサブディレクトリを比較対象から除外できます。複数の -x オプションを使用して、複数のパターンを指定することも可能です。例えば、次のコマンドはディレクトリ dir1dir2 を再帰的に比較し、logtmp のディレクトリを除外します:

1$ diff -rs dir1 dir2 -x "log" -x "tmp"

このコマンドは logtmp ディレクトリを除外して、その他のファイルとサブディレクトリを比較します。

ファイルを比較した結果、内容が異なる場合だけを簡潔に報告するには?

diff コマンドの -q または --brief オプションを使用することで、ファイルが異なるかどうかだけを簡潔に報告することができます。例えば、次のコマンドは file1.txtfile2.txt の違いを簡潔に報告します:

1$ diff file1.txt file2.txt
21c1
3< aaa
4---
5> abc
6
7$ diff -q file1.txt file2.txt
8ファイル file1.txt と file2.txt は異なります

このコマンドは、ファイルが異なるかどうかだけを示すメッセージを出力します。

(サブディレクトリを含む)ディレクトリ内で、ディスク使用量が最も大きいファイルを特定するには?

du コマンドを使用してディレクトリ内のディスク使用量を表示し、最もディスク使用量が大きいファイルを特定することができます。具体的には、次のコマンドを使用します:

1$ du -abk /DB | sort -nr | head -n 10

このコマンドの説明は以下の通りです:

  • -a オプションは、ディレクトリ内のすべてのファイルとサブディレクトリのエントリを表示します。
  • -b オプションは、ディスク使用量をバイト単位で表示します。
  • -k オプションは、ディスク使用量を 1024 バイト (1 kiB) ブロック単位で表示します。
  • sort -nr コマンドは、ディスク使用量を数値として逆順にソートします。
  • head -n 10 コマンドは、最もディスク使用量が大きい上位10ファイルを表示します。

このコマンドを実行することで、指定したディレクトリ内でディスク使用量が最も大きいファイルやサブディレクトリを簡単に特定することができます。

設定ファイルやテンプレート内で、特定の環境変数だけを動的に置換し、他の環境変数はそのままにしておくには?

envsubst コマンドを使用すると、設定ファイルやテンプレート内で特定の環境変数だけを動的に置換し、他の環境変数はそのままにすることができます。これにより、設定ファイルの一部だけを変数に基づいて更新し、固定部分は変更せずに済みます。

具体的な使用例は以下の通りです:

  • すべての環境変数を置換する場合

    1$ export FOO=BAR
    2$ echo 'dont substitute $THIS but do substitute $FOO' | envsubst
    3dont substitute  but do substitute BAR
    

    この例では、未定義の $THIS は空文字に置換され、定義された $FOOBAR に置換されます。すべての環境変数を置換する際に使います。

  • 特定の環境変数のみを置換する場合

    1$ echo 'dont substitute $THIS but do substitute $FOO' | envsubst '$FOO'
    2dont substitute $THIS but do substitute BAR
    

    この例では、指定した $FOO のみが置換され、$THIS はそのまま残ります。設定ファイルやテンプレートで特定の変数だけを更新したい場合に便利です。

このようにすることで、設定ファイルの一部を動的に変更し、他の部分は固定することができます。

特定のディレクトリ内で、ファイルタイプに基づいてファイルを検索し、検索する階層を制限するには?

find コマンドを使用すると、指定したディレクトリ内で特定のファイルタイプだけを検索し、探索する階層を制限できます。たとえば、指定したディレクトリ内で通常のファイルだけを検索し、階層1までのファイルのみを対象にすることができます。

1# 指定ディレクトリで通常のファイルだけを検索し、階層1まで探索する
2find ${RECEIVE_DIR}/ -maxdepth 1 -type f

特定のディレクトリやファイルを検索結果から除外し、それ以外のファイルをリストアップするには?

find コマンドの -prune オプションを使うと、特定のディレクトリやファイルを検索対象から除外することができます。このオプションを使用することで、指定したディレクトリやファイルを検索結果から除外し、他のファイルだけを表示することができます。

1# log または SELECT というディレクトリを除外し、その他のファイルを表示する
2find . -type d \( -name log -o -name SELECT \) -prune -o -type f -print

更新日時やタイムスタンプに基づいてファイルを絞り込み、指定の期間内のファイルを検索するには?

find コマンドを使って、ファイルの更新日時やタイムスタンプに基づいてファイルを検索することができます。これにより、特定の期間内に更新されたファイルだけをリストアップできます。たとえば、ある日時のファイルだけを見つけたい場合や、指定した日時の範囲内にあるファイルを検索する場合に便利です。

1# 2023年7月19日までに更新されたファイルを検索する
2find . -name "*.txt" -newermt "20230718 23:59:59" ! -newermt "20230719 23:59:59"

タイムスタンプが指定ファイルよりも新しいファイルを見つけるには?

find コマンドの -newer オプションを使用すると、指定したファイルのタイムスタンプよりも新しいファイルを検索することができます。この方法は、ある基準となるファイルよりも更新されたファイルを特定するのに役立ちます。

1# 指定ファイルよりも新しく更新されたファイルを検索する
2find . -name "*.txt" -newer somefile.txt

ファイルをリモートマシンに転送するときにファイル名を変更するには?

ftp コマンドを使用すると、ローカルマシン上のファイルをリモートマシンに転送することができます。この際、リモートマシン上でのファイル名を指定することも可能です。転送する際に、リモートマシンでのファイル名を異なる名前に設定することで、リモートサーバー上での管理がしやすくなります。

1# ローカルファイル localfile.txt をリモートマシンに転送し、リモートマシンでは remote_file.txt として保存する
2ftp> put localfile.txt remote_file.txt

ディレクトリ内のファイルを検索する際に、バイナリファイルとテキストファイルの違いを確認する方法は?

file コマンドを使用して、複数のファイルがバイナリファイルかテキストファイルかを一度に確認できます。

1$ file /usr/bin/some_binary_file /usr/bin/some_text_file
2/usr/bin/some_binary_file: data
3/usr/bin/some_text_file: ASCII text

バイナリファイルを除外してテキストファイルのみを対象にするには、grep コマンドの -I オプションを使用します。

1$ grep "search_pattern" /usr/bin/*
2/usr/bin/some_binary_file:search_pattern
3/usr/bin/some_text_file:search_pattern
4
5$ grep -I "search_pattern" /usr/bin/*
6/usr/bin/some_text_file:search_pattern

ファイルの内容を検索する際に、検索結果に行番号も表示させるには?

grep コマンドの -n オプションを使用します。これにより、検索結果に各行の行番号が表示されます。

1$ grep "example" sample.txt
2This is an example line.
3Another example line here.
4
5$ grep -n "example" sample.txt
62:This is an example line.
75:Another example line here.

ファイルの内容を検索する際に、指定したパターンに一致しない行だけを表示させるには?

grep コマンドの -v オプションを使用します。これにより、指定されたパターンに一致しない行だけが表示されます。

sample.txt の内容:

1This is a test line.
2This is an example line.
3Another test line.
4Yet another line.
5Another example line here.

実行例:

1$ grep "example" sample.txt
2This is an example line.
3Another example line here.
4
5$ grep -v "example" sample.txt
6This is a test line.
7Another test line.
8Yet another line.

ファイルの内容を検索する際に、単語全体として一致する行のみを表示させるには?

grep コマンドの -w オプションを使用します。これにより、検索パターンが単語全体として一致する行のみが表示され、単語の一部として含まれる場合は表示されません。

 1$ grep "cat" sample.txt
 2The catalog for the new books is available online.
 3The educational material was very thorough.
 4I spotted a bobcat while hiking in the forest.
 5The cat is on the roof.
 6The playful cat! Meowed loudly.
 7I saw a cat-like creature in the yard.
 8
 9$ grep -w "cat" sample.txt
10The cat is on the roof.
11The playful cat! Meowed loudly.
12I saw a cat-like creature in the yard.

ファイルの内容を検索して、指定したパターンと完全一致する行を表示するには?

grep コマンドの -x オプションを使用します。これにより、行全体が指定したパターンと完全に一致する場合のみ、その行が表示されます。

1$ grep "exact match line" sample.txt
2exact match line here.
3A line with exact match line in it.
4
5$ grep -x "exact match line" sample.txt
6exact match line

ファイルの内容を検索する際に、検索結果にファイル名も含めて表示させるには?

grep コマンドの -H オプションを使用します。これにより、検索結果にファイル名が含まれるようになります。

1$ grep "example" sample.txt
2This is an example line.
3Another example line here.
4
5$ grep -H "example" sample.txt
6sample.txt:This is an example line.
7sample.txt:Another example line here.

複数のファイルを検索する際に、出力結果からファイル名の表示を取り除くには?

grep コマンドの -h オプションを使用します。これにより、複数のファイルを検索する際に出力からファイル名のプレフィックスが削除されます。

1$ grep "example" file1.txt file2.txt
2file1.txt:This is an example line.
3file2.txt:Another example line here.
4
5$ grep -h "example" file1.txt file2.txt
6This is an example line.
7Another example line here.

ファイルを検索する際に、バイナリファイルを無視してテキストファイルだけを対象にするには?

grep コマンドの -I オプションを使用します。これにより、バイナリファイルを無視してテキストファイルのみが検索対象となります。

1# ファイルがバイナリかテキストかを確認するには、`file` コマンドを使用する
2$ file *
3some_binary_file: data
4some_text_file: text
5
6$ grep -Il "^[^#]*\s*exec\s" *
7some_text_file

ファイル内の特定のパターンが含まれるファイルのみをリストアップするには?

grep コマンドの -l オプションを使用します。これにより、パターンにマッチする行を含むファイル名のみが出力されます。

1$ grep "search" file.txt
2search term
3another search term
4
5$ grep -l "search" file.txt
6file.txt

特定の文字列を含まないファイル名だけをリストするには?

grep コマンドの -L オプションを使用します。 -L オプションは、指定した文字列を含まないファイルの名前だけを標準出力に表示します。

 1$ cat normal.txt
 2normal
 3
 4$ cat warning.txt
 5warning
 6
 7$ cat error.txt
 8error
 9
10$ grep -L 'error' normal.txt warning.txt error.txt
11normal.txt
12warning.txt

テキストから特定のパターンにマッチする部分だけを抽出し、それぞれを個別の行に表示するには?

grep コマンドの -o オプションを使うと、マッチした部分だけを表示し、それぞれを別の行に出力できます。

1$ echo "State of A : RUN State of B : STOP State of C : RUN" | \
2grep -Eo '(\S+\s+){4}\S+'
3State of A : RUN
4State of B : STOP
5State of C : RUN

ファイル内の固定文字列にマッチする行を検索するには?

grep コマンドの -F オプションを使うと、パターンを固定文字列として扱います。一方、-F オプションを使用しない場合は、パターンが正規表現として扱われます。

 1$ cat file.txt
 2apple pie
 3apple (pie)
 4apple.pie
 5apple+pie
 6
 7$ grep -F "apple.pie" file.txt
 8apple.pie
 9
10$ grep "apple.pie" file.txt
11apple pie
12apple.pie
13apple+pie

パターンファイルを使って、ファイル内の行を検索するには?

grep コマンドの -f オプションを使用すると、パターンファイルから複数のパターンを読み込み、それらのパターンでファイル内のテキストを検索することができます。

以下の例では、grepを使ってcsvの1〜4カラムがユニークな行のみを出力します。

 1$ cat sample.csv
 220230830,52678,004,Apple,21
 320230830,52678,004,Apple,20
 420230830,52678,004,Apple,19
 520230831,47689,001,Orange,15
 620230901,47620,002,Grape,29
 7
 8$ cut -d, -f 1-4 sample.csv | uniq -d   # uniqコマンドの-dオプションは重複行のみを出力する
 920230830,52678,004,Apple
10
11$ grep -vF -f <(cut -d, -f 1-4 sample.csv | uniq -d) sample.csv
1220230831,47689,001,Orange,15
1320230901,47620,002,Grape,29
  • -f FILE: 指定したファイルからパターンを読み込みます。この例ではプロセス置換を使用して、cutuniq コマンドの出力をパターンとして直接 grep に渡します。
  • -v: マッチしない行を表示します。
  • -F: パターンを固定文字列として扱います。
  • プロセス置換 (<(...)): cutuniq コマンドの出力を一時的なファイルとして grep コマンドに渡すために使用しています。

ファイル内で特定のパターンを検索し、結果を表示せずにマッチする文字列が見つかった時点で検索を終了するには?

grep コマンドで出力を抑制し、最初にマッチした時点でスキャンを終了するには、-q(または --quiet または --silent)オプションを使用します。このオプションを指定すると、マッチの有無だけが判定され、通常の出力が抑制されます。

1$ ### bash配列の存在チェック ###
2$ array=('apple' 'orange' 'banana' 'peach')
3$ grep -wq "banana" <<< "${array[@]}"
4$ echo $?
50
6$ grep -wq "bana" <<< "${array[@]}"
7$ echo $?
81

ディレクトリ内のファイルを再帰的に検索する際、ヒットしたシンボリックリンクのリンク先をたどるかどうかを制御するには?

ディレクトリ内のファイルやシンボリックリンクを再帰的に検索する際、シンボリックリンクをたどるかどうかを制御するには、-r(または --recursive)オプションと -R オプションを使用します。

  • -r(または --recursive)オプション: シンボリックリンクがコマンドラインに指定されている場合に限り、各ディレクトリ内のすべてのファイルを再帰的に読み込みます。ファイルを指定しない場合は、現在の作業ディレクトリが検索対象となります。

  • -R オプション: 各ディレクトリ内のすべてのファイルを再帰的に読み込みます。また、すべてのシンボリックリンクもたどります。これは、-r オプションとは異なり、シンボリックリンクも含めて検索を行います。

 1$ ls -l
 2合計 4
 3-rw-r--r--. 1 dam dam 12  9月  3 16:59 file1
 4lrwxrwxrwx. 1 dam dam  7  9月  3 17:00 link_to_dir2 -> ../dir2
 5lrwxrwxrwx. 1 dam dam 13  9月  3 17:00 link_to_file2 -> ../dir2/file2
 6
 7$ cat file1
 8search_term
 9
10$ cat ../dir2/file2
11search_term
12
13$ grep -r "search_term" .      # シンボリックリンクがコマンドラインに指定されていないのでリンク先は検索対象外!
14./file1:search_term
15
16$ grep -R "search_term" .
17./file1:search_term
18./link_to_file2:search_term
19./link_to_dir2/file2:search_term
20
21$ grep -r "search_term"        # シンボリックリンクがコマンドラインに指定されていないのでリンク先は検索対象外!
22file1:search_term
23
24$ grep -R "search_term"
25file1:search_term
26link_to_file2:search_term
27link_to_dir2/file2:search_term
28
29$ grep -r "search_term" *      # パス名展開によりシンボリックリンクがコマンドラインに指定される!
30file1:search_term
31link_to_dir2/file2:search_term
32link_to_file2:search_term
33
34$ grep -R "search_term" *
35file1:search_term
36link_to_dir2/file2:search_term
37link_to_file2:search_term

grep でファイルが存在しない場合や読み込めない場合に、エラーメッセージを表示しないようにするには?

ファイルが存在しない場合や読み込めない場合にエラーメッセージを表示しないようにするには、-s(または --no-messages)オプションを使用します。このオプションを指定すると、エラーメッセージが抑制されます。

1$ ls file
2ls: 'file' にアクセスできません: そのようなファイルやディレクトリはありません
3
4$ grep -s 'test' file
5$ echo $?
62

ファイルの内容を16進数やASCII文字で表示するには?

hexdump コマンドを使用してファイルの内容を表示します。-C オプションと -v オプションは、表示形式や内容の表示方法に影響を与えます。

-C オプション は、標準的な16進数とASCII形式でファイル内容を表示します。16進数でのオフセットを表示し、その後にデータを1バイトずつ2桁の16進数で表現し、1行あたり16バイトが表示されます。右側にはASCII文字も表示されます。

-v オプション は、 全ての入力データを表示します。-v オプションを指定しない場合、連続する同じ内容の行は1行のアスタリスク(*)で置き換えられます。-v オプションを使用すると、すべての行がそのまま表示され、内容が完全に表示されます。
※連続する同じ行とは、hexdump実行結果に対するものであって、入力ファイルに対するものではないことに注意。

 1$ cat sample.txt
 2Hello,world!!!!
 3Hello,world!!!!
 4Good evening,worGood evening,wor
 5Good evening,world!
 6Good evening,world!
 7
 8$ hexdump -Cv sample.txt
 900000000  48 65 6c 6c 6f 2c 77 6f  72 6c 64 21 21 21 21 0a  |Hello,world!!!!.|
1000000010  48 65 6c 6c 6f 2c 77 6f  72 6c 64 21 21 21 21 0a  |Hello,world!!!!.|
1100000020  47 6f 6f 64 20 65 76 65  6e 69 6e 67 2c 77 6f 72  |Good evening,wor|
1200000030  47 6f 6f 64 20 65 76 65  6e 69 6e 67 2c 77 6f 72  |Good evening,wor|
1300000040  0a 47 6f 6f 64 20 65 76  65 6e 69 6e 67 2c 77 6f  |.Good evening,wo|
1400000050  72 6c 64 21 0a 47 6f 6f  64 20 65 76 65 6e 69 6e  |rld!.Good evenin|
1500000060  67 2c 77 6f 72 6c 64 21  0a                       |g,world!.|
1600000069
17
18$ hexdump -C sample.txt
1900000000  48 65 6c 6c 6f 2c 77 6f  72 6c 64 21 21 21 21 0a  |Hello,world!!!!.|
20*
2100000020  47 6f 6f 64 20 65 76 65  6e 69 6e 67 2c 77 6f 72  |Good evening,wor|
22*
2300000040  0a 47 6f 6f 64 20 65 76  65 6e 69 6e 67 2c 77 6f  |.Good evening,wo|
2400000050  72 6c 64 21 0a 47 6f 6f  64 20 65 76 65 6e 69 6e  |rld!.Good evenin|
2500000060  67 2c 77 6f 72 6c 64 21  0a                       |g,world!.|
2600000069

ホスト名を表示する際に、ドメイン情報を除いてホスト名だけを表示するには?

コマンド hostname -s を使用します。

1$ hostname
2myhostname.example.com
3
4$ hostname -s
5myhostname

プロセスの存在(生死)を確認するには?

kill コマンドを使用すると、プロセスID(pid)の存在を確認できます。具体的には、kill -0 $pid を使うことでプロセスの存在チェックが可能です。「0」シグナルを使うことで、プロセスが存在しているかどうかを確認できますが、プロセスに対して実際のシグナルは送信されません。このコマンドの返り値をチェックすることで、プロセスが存在するかどうかを判断できます。プロセスが存在すればコマンドは成功し、存在しなければエラーが返されます。

以下のスクリプトは、プロセスの存在を確認する方法を示しています。

1# プロセスの存在をチェック
2if kill -0 "$pid" 2>/dev/null; then
3    echo "Process $pid exists."
4fi

このスクリプトでは、kill -0 "$pid" を使用してプロセスID $pid の存在を確認し、存在する場合にメッセージを表示します。

同様のチェックを ps コマンドで行うこともできます:

1if ps -p "$pid" > /dev/null; then
2    echo "Process $pid exists."
3fi

隠しファイルを含めて全てのファイルを表示するには?

ls コマンドを使用します。-a または --all オプションを付けることで、隠しファイル(. で始まるファイル)も含めて全てのファイルを表示できます。

1$ ls -a
2.  ..  .bashrc  .profile  file1.txt  file2.txt

ディレクトリ自体をリスト表示するには?

ls コマンドを使用します。-d または --directory オプションを付けることで、ディレクトリの内容ではなくディレクトリ自体をリスト表示できます。

1$ ls -ld /etc
2drwxr-xr-x 1 root root 4096 2024-09-06 07:13 /etc

ファイルのインデックス番号(inode番号)を表示するには?

ls コマンドを使用します。-i または --inode オプションを付けることで、各ファイルのインデックス番号(inode番号)を表示できます。

1$ ls -i
2131072 .bashrc  131073 .profile  131074 file1.txt  131075 file2.txt

サブディレクトリを再帰的にリスト表示するには?

ls コマンドを使用します。-R オプションを付けることで、見つかったサブディレクトリを再帰的にリスト表示できます。

1$ ls -R
2.:
3file1.txt  file2.txt  subdir
4
5./subdir:
6file3.txt

ファイルの詳細なタイムスタンプを表示するには?

ls コマンドを使用します。--full-time オプションを付けることで、ファイルの詳細なタイムスタンプを表示できます。

1$ find DIR -type f | xargs ls --full-time | sort -k6,7
2-rw-r--r-- 1 user group 1234 2023-09-07 07:13:40.000000000 +0900 file1.txt
3-rw-r--r-- 1 user group 5678 2023-09-07 07:13:41.000000000 +0900 file2.txt

特定の時刻/日付形式でファイルのタイムスタンプを表示するには?

ls コマンドを使用します。--time-style=TIME_STYLE オプションを付けることで、特定の時刻/日付形式でファイルのタイムスタンプを表示できます。TIME_STYLE 引数には、full-isolong-isoisolocale、または +FORMAT を指定できます。

1$ find DIR -type f | xargs ls -l --time-style='+%Y%m%d%H%M%S' | sort -k6,6
2-rw-r--r-- 1 user group 1234 20230907071340 file1.txt
3-rw-r--r-- 1 user group 5678 20230907071341 file2.txt

ファイルサイズでソートするには?

ls コマンドを使用します。-S オプションを付けることで、ファイルサイズでソートできます。デフォルトでは、サイズの大きい順に表示されます。

 1$ ls -lS
 2合計 40
 3-rw-r--r--. 1 dam user 20480  7月 30 16:43 file3.txt
 4-rw-r--r--. 1 dam user 10240  7月 30 16:42 file1.txt
 5-rw-r--r--. 1 dam user  5120  7月 30 16:43 file2.txt
 6
 7$ ls -lSr
 8合計 40
 9-rw-r--r--. 1 dam user  5120  7月 30 16:43 file2.txt
10-rw-r--r--. 1 dam user 10240  7月 30 16:42 file1.txt
11-rw-r--r--. 1 dam user 20480  7月 30 16:43 file3.txt

システム上で現在使用されているすべてのファイルを表示するには?

lsof コマンドを使用します。このコマンドを実行すると、システム上で現在オープンされているすべてのファイルのリストが表示されます。

1# 全てのオープンファイルを表示
2$ lsof
3COMMAND    PID  USER   FD   TYPE DEVICE SIZE/OFF NODE NAME
4systemd      1  root  cwd    DIR  253,0     4096    2 /
5systemd      1  root  rtd    DIR  253,0     4096    2 /
6systemd      1  root  txt    REG  253,0  1620224 821084 /lib/systemd/systemd

特定のプロセスによって使用されているファイルを表示するには?

lsof -p <PID> コマンドを使用します。ここで <PID> はプロセスIDです。このコマンドは、指定したプロセスが開いているファイルのリストを表示します。

1# 特定のプロセスによって開かれているファイルを表示
2$ lsof -p 1234
3COMMAND    PID  USER   FD   TYPE DEVICE SIZE/OFF NODE NAME
4myprocess 1234  user  cwd    DIR  253,0     4096    2 /home/user
5myprocess 1234  user  txt    REG  253,0  1620224 821084 /usr/bin/myprocess

特定のユーザーによって使用されているファイルを表示するには?

lsof -u <username> コマンドを使用します。ここで <username> はユーザー名です。指定したユーザーが開いているファイルのリストが表示されます。

1# 特定のユーザーによって開かれているファイルを表示
2$ lsof -u username
3COMMAND    PID  USER   FD   TYPE DEVICE SIZE/OFF NODE NAME
4bash      5678  user  cwd    DIR  253,0     4096    2 /home/user
5bash      5678  user  txt    REG  253,0  1620224 821084 /bin/bash

特定のファイルやディレクトリが使用されているか確認するには?

lsof <filename> コマンドを使用します。ここで <filename> はファイル名またはディレクトリ名です。このコマンドは、指定したファイルやディレクトリを開いているプロセスのリストを表示します。

1# 特定のファイルやディレクトリが開かれているか確認
2$ lsof /path/to/file
3COMMAND    PID  USER   FD   TYPE DEVICE SIZE/OFF NODE NAME
4vim       9101  user  txt    REG  253,0  1620224 821084 /path/to/file

ネットワーク接続の情報を表示するには?

lsof -i コマンドを使用します。このコマンドは、ネットワーク接続のリストを表示します。特定のプロトコル(TCP、UDPなど)やポート番号に基づいてフィルタリングすることもできます。

1# ネットワーク接続の情報を表示
2$ lsof -i
3COMMAND    PID  USER   FD   TYPE DEVICE SIZE/OFF NODE NAME
4sshd      1234  root  txt    REG  253,0  1620224 821084 TCP *:22 (LISTEN)

特定のポートやプロトコルに基づいてフィルタリングする場合は、以下のように使用します。

1# 特定のポートに基づいてフィルタリング
2$ lsof -i :80
3COMMAND    PID  USER   FD   TYPE DEVICE SIZE/OFF NODE NAME
4httpd     5678  root  txt    REG  253,0  1620224 821084 TCP *:80 (LISTEN)
5
6# 特定のネットワークプロトコルに基づいてフィルタリング
7$ lsof -i tcp
8COMMAND    PID  USER   FD   TYPE DEVICE SIZE/OFF NODE NAME
9sshd      1234  root  txt    REG  253,0  1620224 821084 TCP *:22 (LISTEN)

ファイルの非表示文字を表示するには?

非表示文字を表示する方法はいくつかあります。

まず、sample.txt ファイルを以下のように作成します。

1$ echo -e "Hello, World!\tThis is a test.\nNew Line here." > sample.txt

\t はタブ、\n は改行コードを示します。

cat コマンドの -A オプションを使用して、非表示文字を表示することができます。タブや改行などが特定の記号で表示されます。

1$ cat -A sample.txt
2Hello, World!^IThis is a test.$
3New Line here.$

^I はタブ文字、$ は行末の改行コードを示します。

hexdump コマンドを使って、ファイルのバイナリ内容を表示します。-C オプションを使用すると、16進数の値と対応するASCII文字が表示されます。

1$ hexdump -C sample.txt
200000000  48 65 6c 6c 6f 2c 20 57  6f 72 6c 64 21 09 54 68  |Hello, World!.Th|
300000010  69 73 20 69 73 20 61 20  74 65 73 74 2e 0a 4e 65  |is is a test..Ne|
400000020  77 20 4c 69 6e 65 20 68  65 72 65 2e 0a           |w Line here..|
50000002d

09 はタブ文字(\t)、0a は改行コード(\n)を示しています。

od コマンドを使用して、ファイルの内容をバイナリ形式で表示します。-c オプションを使用すると、文字として表示されます。

 1$ od sample.txt
 20000000 062510 066154 026157 053440 071157 062154 004441 064124
 30000020 071551 064440 020163 020141 062564 072163 005056 062516
 40000040 020167 064514 062556 064040 071145 027145 000012
 50000055
 6
 7$ od -c sample.txt
 80000000   H   e   l   l   o   ,       W   o   r   l   d   !  \t   T   h
 90000020   i   s       i   s       a       t   e   s   t   .  \n   N   e
100000040   w       L   i   n   e       h   e   r   e   .  \n
110000055

ファイルやディレクトリの絶対パスを取得するには?

realpath コマンドは、指定されたファイルやディレクトリの絶対パスを表示します。相対パスやシンボリックリンクを解決し、最終的な絶対パスを出力します。

  1. 相対パスから絶対パスを取得する

    1$ realpath myfile.txt
    2/home/user/project/myfile.txt
    
  2. シンボリックリンクを解決する

    1$ realpath /path/to/symlink
    2/home/user/target/actualfile.txt
    
  3. ディレクトリの絶対パスを取得する

    1$ realpath /home/user/../user/docs
    2/home/user/docs
    

ディスクI/Oにおけるバッファキャッシュの使用状況を表示するには?

sar -b コマンドを使用します。 -b はディスクI/Oのバッファキャッシュ使用状況を表示します。以下の例では、データを1秒間隔で3回収集することを指定しています。

1$ sar -b 1 3
2Linux 4.15.0-96-generic (hostname) 	09/05/2024 	_x86_64_	(4 CPU)
3
409:00:01 AM  kbmemfree kbmemused %memused kbbuffers kbcached  %buff %cache
509:00:02 AM      10240     20480      66.0       5120      8192   25.0   40.0
609:00:03 AM      10240     20480      66.0       5120      8192   25.0   40.0
709:00:04 AM      10240     20480      66.0       5120      8192   25.0   40.0
8
9Average:           10240     20480      66.0       5120      8192   25.0   40.0
  • kbmemfree: 自由に使えるメモリ量(KB単位)
  • kbmemused: 使用中のメモリ量(KB単位)
  • %memused: 使用中のメモリの割合
  • kbbuffers: ディスクI/Oのために使用されているバッファキャッシュのメモリ量(KB単位)
  • kbcached: ディスクI/Oのために使用されているキャッシュのメモリ量(KB単位)
  • %buff: バッファキャッシュの使用割合
  • %cache: キャッシュの使用割合

メモリの使用状況を表示するには?

sar -r コマンドを使用します。 -r はメモリの使用状況を表示します。以下の例では、データを1秒間隔で3回収集することを指定しています。

1$ sar -r 1 3
2Linux 4.15.0-96-generic (hostname) 	09/05/2024 	_x86_64_	(4 CPU)
3
409:00:01 AM  kbmemfree kbmemused %memused kbbuffers kbcached  %buff %cache
509:00:02 AM      10240     20480      66.0       5120      8192   25.0   40.0
609:00:03 AM      10240     20480      66.0       5120      8192   25.0   40.0
709:00:04 AM      10240     20480      66.0       5120      8192   25.0   40.0
8
9Average:           10240     20480      66.0       5120      8192   25.0   40.0
  • kbmemfree: 自由に使えるメモリ量(KB単位)
  • kbmemused: 使用中のメモリ量(KB単位)
  • %memused: 使用中のメモリの割合
  • kbbuffers: ディスクI/Oのために使用されているバッファキャッシュのメモリ量(KB単位)
  • kbcached: ディスクI/Oのために使用されているキャッシュのメモリ量(KB単位)
  • %buff: バッファキャッシュの使用割合
  • %cache: キャッシュの使用割合

CPUの使用状況を表示するには?

sar -u コマンドを使用します。 -u はCPUの使用状況を表示します。以下の例では、データを1秒間隔で3回収集することを指定しています。

1$ sar -u 1 3
2Linux 4.15.0-96-generic (hostname) 	09/05/2024 	_x86_64_	(4 CPU)
3
409:00:01 AM  %usr  %nice  %sys  %iowait  %irq  %soft  %steal  %guest  %idle
509:00:02 AM   15.00   0.00   5.00    2.00   0.00   0.00   0.00   0.00  78.00
609:00:03 AM   15.00   0.00   5.00    2.00   0.00   0.00   0.00   0.00  78.00
709:00:04 AM   15.00   0.00   5.00    2.00   0.00   0.00   0.00   0.00  78.00
8
9Average:        15.00   0.00   5.00    2.00   0.00   0.00   0.00   0.00  78.00
  • %usr: ユーザーモードでのCPU使用率
  • %nice: 優先度変更済みプロセスによるCPU使用率
  • %sys: カーネルモードでのCPU使用率
  • %iowait: 入出力待ちによるCPU使用率
  • %irq: ハードウェア割り込みによるCPU使用率
  • %soft: ソフトウェア割り込みによるCPU使用率
  • %steal: 仮想化環境でのCPUの「奪われた」割合
  • %guest: ゲストOSのCPU使用率(仮想化環境で)
  • %idle: アイドル(待機)CPU使用率

ファイルのタイムスタンプを改変するには?

touch -d コマンドを使用します。 touch -d コマンドを使用することで、ファイルのタイムスタンプを指定した日付や時刻に設定できます。以下にいくつかの用例を示します。

  • 特定の日時に設定する:
1$ touch -d "2024-01-01 12:00:00" filename.txt

このコマンドは、filename.txt のタイムスタンプを 2024年1月1日 12時00分00秒 に設定します。

  • 現在の日時に設定する(タイムスタンプを更新):
1$ touch filename.txt

このコマンドは、filename.txt のタイムスタンプを現在の時刻に更新します。

  • 日付だけで設定する(時刻はデフォルトで00:00:00):
1$ touch -d "2024-01-01" filename.txt

このコマンドは、filename.txt のタイムスタンプを 2024年1月1日に設定し、時刻は00:00:00になります。

  • 相対的な日時で設定する(例えば「1日前」):
1$ touch -d "1 day ago" filename.txt

このコマンドは、filename.txt のタイムスタンプを現在の時刻から1日前に設定します。

  • 特定のタイムゾーンに設定する:
1$ TZ=Asia/Tokyo touch -d "2024-01-01 12:00:00" filename.txt

このコマンドは、filename.txt のタイムスタンプを 2024年1月1日 12時00分00秒(東京時間)に設定します。

現在使用している端末のデバイスファイル名を表示するには?

tty コマンドを使用します。 tty コマンドは、現在使用している端末のデバイスファイル名を表示します。このファイル名は、端末がシステム内でどのように識別されるかを示します。以下に用例を示します。

1$ tty
2/dev/ttys000

このコマンドは、現在の端末が /dev/ttys000 というデバイスファイルであることを示しています。これは、あなたがログインしている端末の識別子であり、ターミナルセッションがどの端末で実行されているかを知るのに役立ちます。

システムのメモリ使用状況やプロセスの統計情報を表示するには?

vmstat コマンドを使用します。 vmstat コマンドは、システムのメモリ、プロセス、ページング、ブロックI/O、ディスクI/O、CPUの統計情報を表示します。以下のコマンドで、1秒間隔で3回、システムの統計情報を表示できます。

1$ vmstat 1 3

出力例:

1procs -----------memory---------- ---swap-- -----io---- --system-- ----cpu----
2 r  b   swpd   free   buff  cache   si   so    bi   bo   in   cs us sy id wa st
3 1  0      0  81448  25680  181496    0    0     15    22    8   18  1  1 98  0  0
4 1  0      0  81448  25680  181496    0    0      0     0  175  242  1  1 98  0  0
5 1  0      0  81448  25680  181496    0    0      0     0  191  274  1  1 98  0  0
  • procs: プロセス情報

    • r: 実行可能なプロセス数(CPUの処理を待っているプロセス数)
    • b: ブロックされているプロセス数(I/O待ちのプロセス数)
  • memory: メモリ使用状況

    • swpd: スワップ領域の使用量(MB)
    • free: 空きメモリの量(KB)
    • buff: バッファメモリの量(KB)
    • cache: キャッシュメモリの量(KB)
  • swap: スワップ領域の使用状況

    • si: スワップイン量(MB/s、スワップ領域からメモリに読み込まれるデータの速度)
    • so: スワップアウト量(MB/s、メモリからスワップ領域に書き込まれるデータの速度)
  • io: I/O統計

    • bi: ブロック読み込み量(ブロック単位、読み込まれたデータの量)
    • bo: ブロック書き込み量(ブロック単位、書き込まれたデータの量)
  • system: システム統計

    • in: 割り込み数(秒あたりのハードウェア割り込みの数)
    • cs: コンテキストスイッチ数(秒あたりのプロセス間の切り替え回数)
  • cpu: CPUの使用状況

    • us: ユーザーモードでのCPU時間(ユーザーのプロセスが消費するCPU時間)
    • sy: システムモードでのCPU時間(カーネルモードでのCPU時間)
    • id: アイドル時間(CPUが何も実行していない時間)
    • wa: I/O待ち時間(CPUがI/O操作を待っている時間)
    • st: ステール時間(仮想化環境でのスチール時間、他の仮想マシンにリソースが奪われている時間)
  • ユーザーモードでのCPU時間 (us): ユーザープログラムがCPUを使用している時間。これには、アプリケーションやスクリプトの実行が含まれます。

  • システムモードでのCPU時間 (sy): カーネルがCPUを使用している時間。システムコールやドライバの処理が含まれます。

  • ステール時間 (st): 仮想化環境で、他の仮想マシンにリソースが奪われた時間。物理CPUが他の仮想マシンに割り当てられているため、現在の仮想マシンのCPUが実行できなかった時間を示します。

find コマンドで取得したファイルを指定したディレクトリに移動するには?

xargs --no-run-if-empty -I コマンドを使用します。 --no-run-if-empty オプションを指定すると、xargs が引数がない場合にコマンドを実行しないようになります。-I オプションを使用すると、指定した文字列(ここでは {})がコマンド内の引数のプレースホルダーとして使われます。

以下のコマンドは、find コマンドで取得したファイル名を xargs に渡し、各ファイルを指定したディレクトリに移動します。--no-run-if-empty により、find が結果を返さなかった場合でもコマンドは実行されません。

1find ${RECEIVE_DIR}/ -maxdepth 1 -type f -name "*.gz" -exec basename {} \; | \
2xargs --no-run-if-empty -I mv -f ${RECEIVE_DIR}/{} ${BKUP_DIR}/${DATE}_{} 2>&1

このコマンドでは、find${RECEIVE_DIR} 内の .gz 拡張子のファイル名を取得し、basename コマンドでファイル名のみを抽出します。その後、xargsmv コマンドを使って、ファイルを ${BKUP_DIR} に移動し、ファイル名に ${DATE}_ を付加します。

find の実行結果を xargs に渡してコマンドを実行する際に、そのコマンドの実行内容を表示するには?

xargs -t -n コマンドを使用します。 -t オプションを指定すると、xargs が実行するコマンドが標準エラー出力(stderr)に表示されます。-n オプションを使うと、一度に指定する引数の数を設定できます。

以下のコマンドは、find コマンドで取得したパスを xargs で処理し、指定された数の引数ごとにコマンドを実行し、その実行コマンドを標準エラー出力に表示します。

 1$ find .
 2.
 3./file1
 4./link_to_file2
 5./link_to_dir2
 6
 7$ find . | xargs -t -n 3 echo
 8echo . ./file1 ./link_to_file2
 9. ./file1 ./link_to_file2
10echo ./link_to_dir2
11./link_to_dir2

このコマンドは、find . で現在のディレクトリ内のすべてのファイルとディレクトリをリストし、xargs -t -n 3 で処理します。-n 3 により、3つの引数ごとに echo コマンドが実行され、その前に実行されるコマンドが標準エラー出力に表示されます。

補足: xargs にコマンドを指定しない場合、デフォルトで echo コマンドが実行されます。xargs は標準入力からアイテムを読み取り、それを指定したコマンド(デフォルトでは echo)で実行します。コマンドを明示的に指定しない場合は、echo がデフォルトのコマンドとして実行されるため、指定しない場合でも echo が実行されます。

自分のコンピュータが使用しているバイトオーダー(エンディアン)を確認する方法は?

コンピュータのバイトオーダー(エンディアン)を確認するには、いくつかの方法がありますが、以下の手順が簡単で一般的です:

  1. lscpu コマンドの利用: lscpu コマンドを実行し、その出力から「Endian」に関する情報を探します。このコマンドは、CPUに関する詳細な情報を提供し、システムのエンディアン形式も確認できる場合があります。

    1$ lscpu | grep "Endian"
    2バイト順序:                          Little Endian
    

    これにより、リトルエンディアン(Little)やビッグエンディアン(Big)が表示されます。

  2. Pythonスクリプトの利用: Pythonを使用して、システムのバイトオーダーを簡単に確認できます。次のスクリプトを実行することで、リトルエンディアンかビッグエンディアンかを確認できます。

    1$ cat sample.py
    2import sys
    3print(sys.byteorder)
    4
    5$ python3 sample.py
    6little
    

関連ページ