[Linux] ファイル名の可搬性を確認するpathchkコマンドの使い方

pathchkコマンドは、引数で指定した名前がファイル名として有効かつ可搬性があるかを確認します。

pathchk – check whether file names are valid or portable

pathchkコマンドはGNU Coreutilsに含まれています。ここでは、pathchkコマンドの基本的な使い方を紹介します。
※以降の実行例は、Ubuntu17.10で確認しています。

1. 使い方

pathchk [option]... name...

optionに何も指定しない場合、以下の3点のチェックを行い、1つでも該当するものがあった場合、エラーを返します。該当するものが無い場合、結果の表示は行わず終了コード’0’を返します。

  • nameで指定したディレクトリが実在し、ディレクトリの検索権限(実行権限)が1つでも無い場合。
  • nameの長さがシステムの設定値を超えている場合。
  • nameで指定した、ディレクトリ名やファイル名の長さががシステムの上限を超えている場合。

 

option 説明
-p 主要なPOSIXに準拠しているか確認します。[a-zA-Z0-9.-_]
-P 空のファイル名もしくは”-“から始まるファイル名を確認します。
--portability 全てのPOSIXに準拠しているか確認します。-p -Pオプションの両方を指定した場合と同じです。
--help ヘルプを表示します。
--version バージョンを表示します。

2. 実行例

2.1. ディレクトリやファイル名が実在しない場合

nameで指定するディレクトリやファイル名は実在しないものでも確認することができます。実行するシステム上に実在しない/a/b/c/d.txtを確認してみます。

$ [ -e /a/b/c/d.txt ];echo $? #パス、ファイルが存在するかを確認
1
$ pathchk /a/b/c/d.txt
$ echo $?
0

ファイルは実在しませんが、pathchkの結果は成功’0’になりました。

2.2. nameで指定したディレクトリが実在し、ディレクトリの検索権限(実行権限)が1つでも無い場合

nameで指定したディレクトリが実在し、そのうちの一つでも検索(実行)権限が無い場合は、エラーになります。

$ chmod a-x ./testdir #実在するディレクトリから検索権限を取り除く
$ pathchk ./testdir/d.txt
pathchk: ./testdir/d.txt: 許可がありません
$ echo $?
1

ディレクトリが実在し、検索権限が無い場合はエラーとなりました。

2.3. nameの長さがシステムの設定値を超えている場合

引数として渡すnameの長さがシステムの設定値を超えている場合はエラーとなります。はじめに実行するシステムで引数のサイズ上限を調べます。

$ grep ARG_MAX /usr/include/linux/limits.h 
#define ARG_MAX       131072    /* # bytes of args + environ for exec() */

このシステムでは’131072‘バイトが上限のようです。131073バイトのランダムな文字列を作成し、引数としてpathchkコマンドに渡してみます。

$ pathchk `cat /dev/urandom | tr -dc 'a-zA-Z0-9' | fold -w 131073 | head -n 1`
-bash: /usr/bin/pathchk: 引数リストが長すぎます
$ echo $?
126

エラーとなりました。

2.4. nameで指定した、ディレクトリ名やファイル名の長さががシステムの上限を超えている場合

ディレクトリ名やファイル名の長さががシステムの上限を超えている場合はエラーになります。はじめに実行するシステムでファイル名の上限を調べます。

$ grep NAME_MAX /usr/include/linux/limits.h
#define NAME_MAX         255    /* # chars in a file name */

このシステムでは’255‘バイトが上限のようです。はじめに255バイトのファイル名で確認してみます。

$ pathchk `cat /dev/urandom | tr -dc 'a-zA-Z0-9' | fold -w 255 | head -n 1`
$ echo $?
0

正常終了しました。次に上限を超える256バイトのファイル名で確認してみます。

$ pathchk `cat /dev/urandom | tr -dc 'a-zA-Z0-9' | fold -w 256 | head -n 1`
pathchk: yW4XWOz5WLUJYLIEFFM3dwk544HBDcynEPyxaVGYAbZxyFeELV7f7FxyLb8hr7UWQlk0M4r8iDcjpOCyYaVqYdnyU0tyqlXrA6kCoDZ90msH6Z8CiRKlYR5d5OIxDT2BwJwFYZCADFsUHPwzpsyB0L3USmse0Ig7YIJ9OnNKm71jOOLQVbpjnTkrRKGUMV48bYDj3uQ9CS5I9kDllbClq7dS4lOJQaPshBbfosR1sA4QD1q4FL3yK50e1tu9zuTk: ファイル名が長すぎます
$ echo $?
1

エラーとなりました。

2.5. POSIX準拠で無い場合

-p‘オプションでPOSIX準拠のファイル名かを確認します。以下のどれかに該当した場合、エラーになります。

  • ファイル名が空の場合。
  • POSIXで規定されてい文字以外を含む場合。POSIXで規定されている文字は、a-z A-Z 0-9 ._-です。
  • POSIXで期待されているファイル長を超える場合。POSIXで規定されているディレクトリ、ファイル名の上限は14です。
$ pathchk -p ./-_.0Aa #正常なファイル名
$ pathchk -p '' #空のファイル名
pathchk: ファイル名が空です
$ pathchk -p ./~-_.0Aa #POSIXに準拠していない文字'~'を含むファイル名
pathchk: ファイル名 './~-_.0Aa' の中に可搬性のない文字 `~' があります
$ pathchk -p 123456789012345 #15文字のファイル名
pathchk: ファイル名の要素 `123456789012345' の長さ 15 は制限値 14 を超えています

2.6. 空ファイル名もしくは’-‘で始まる場合

-P‘オプションで空のファイル名、’-‘で始まるファイル名の確認ができます。

$ pathchk -P 123456789012345 #15文字のファイル名
$ pathchk -P '' #空のファイル名
pathchk: ファイル名が空です
$ pathchk -P './-_.0Aa' #'-'ではじまるファイル名
pathchk: leading '-' in a component of file name './-_.0Aa'

 
全てのPOSIXに準拠しているかを確認するには、オプションで’-pP‘もしくは’--portability‘を指定することで確認ができます。
 
以上、ファイル名の可搬性を確認するpathchkコマンドの使い方の紹介でした。