本連載は、Linuxのコマンドについて、基本書式からオプション、具体的な実行例までを紹介していきます。今回はPOSIXシステムで使用できるファイル名かどうかを確認する「pathchk」コマンドです。
この記事は会員限定です。会員登録(無料)すると全てご覧いただけます。
本連載は、Linuxのコマンドについて、基本書式からオプション、具体的な実行例までを紹介していきます。今回はPOSIXシステムで使用できるファイル名かどうかを確認する「pathchk」コマンドです。
「pathchk」は指定したファイル名やパス名がPOSIXシステムで使用できるかどうかを確認するコマンドです。
現在利用中のOSで使用できるファイル名であっても、他のシステムでは使えないかもしれない、つまり可搬性(ポータビリティー)がないかもしれません。pathchkコマンドではPOSIXシステムで問題ないファイル名かどうかを確認できます。
シェルスクリプトの中で、ファイル名を確認する際に使用するという使い方もあるでしょう。
pathchk [オプション] パス名
※ [ ]は省略可能な引数を示しています。
短いオプション | 長いオプション | 意味 |
---|---|---|
-p | ほとんどのPOSIXシステムで使用できるかどうかを確認する | |
-P | ファイル名やディレクトリ名が「-」で始まっていないかどうかを確認する | |
--portability | 全てのPOSIXシステムで使用できるかどうかを確認する(「-p -P」相当) | |
「pathchk パス名」で、現在使用しているファイルシステム上で使用できる名前かどうかを確認します。使用できない文字があったり、長過ぎたりといった問題がある場合は、メッセージを表示します(※1)。問題がない場合は何も表示しません。
※1 CentOS 8の場合、パス全体で4096文字、ファイル名は255文字が最大文字数となっている。それぞれ「getconf」コマンドを使って「getconf PATH_MAX /usr」「getconf NAME_MAX /usr」を実行することで、「/usr」のファイルシステムで使用できるパス名と名前の最大文字数を確認できる(linux/limits.hで定義されている)。
ほとんどのPOSIXシステム上で問題ないかどうかを確認するには「pathchk -p パス名」を実行します。POSIXで使用できるファイル名は、アルファベットの「A〜Z」「a〜z」の他、「数字の0〜9」「.」「_」「-」だけです。これ以外の文字が使用されている場合やファイル名が14文字を超えている場合、パス名全体で255文字を超えている場合はメッセージを出力します。
この他、「pathchk -P パス名」で、ファイルやディレクトリの名前が「-」で始まっていないかどうかを確認することができます。これは何かのコマンドでオプションを指定する場合に問題が起こらないようにするために役立ちます。
「pathchk -pP パス名」のように、「-p」と「-P」の両方を指定することで、パス名がPOSIX上問題ないかどうかを確認できます。「-pP」の代わりにロングオプション「--portability」を使うこともできます。
pathchk パス名
(パス名が現在使用しているファイルシステム上で使用できるかどうかを確認する)
pathchk -pP パス名
(パス名がPOSIX上問題ないかどうかを確認する)
画面1では、「デスクトップ」「/tmp/dir1/test文書」「longfilename.txt」について確認しています。3つとも、現在のOS(ここではCentOS 8)では使用できますが、他のOS(POSIXシステム)では問題があるかもしれないことが分かります。
画面2では、「/tmp/-test.txt」と「tmp-test.txt」「-test.txt」について確認しています。いずれも「-p」ではエラーになりませんが、「/tmp/-test.txt」と「-test.txt」については「-P」でエラーになりました。
なお、「-test.txt」のようにパス名の先頭が「-」の場合、pathchkコマンドに対するオプションとして解釈されてしまうため、エラーになります。そこで、「pathchk -- -test.txt」のように、間に「--」を挟んでいます。このように、「-」から始まる名前はコマンドラインで扱いにくいため使用しないことをおすすめします。
pathchkには終了コードがあり、問題がない場合は「0」、問題がある場合は「1」を返します。そこで、シェルスクリプトの中では「if pathchk パス名」のようにif文を使って、パス名に問題がないかどうかを確認できます。
次のif文は、変数「FILENAME」にセットされている内容がパス名として問題ないかどうかを確認し、問題がなければ「OK」、問題があれば「NG」というメッセージを表示します。
if pathchk -pP -- "$FILENAME" 2>/dev/null then echo "OK" else echo "NG" fi
if文の使い方については連載第223回や“応用力”をつけるためのLinux再入門(27)を参照してください。
pathchkに限った話ではありませんが、長いファイル名や長いパス名を試すために、「長い文字列」を作りたくなることがあります。
次のコマンド例は、変数FILENAMEに、ランダムなアルファベット小文字255個分の文字列を保存します。
FILENAME=`cat /dev/urandom | tr -dc "a-z" | head -c 255`
「/dev/urandom」は、ランダムな値を発生する疑似デバイスで、「cat /dev/urandom」とすることでランダムな値を出力できます。/dev/urandomの出力にはアルファベット以外の値も含まれています。そこで、「tr」コマンドで「a-z」以外の文字を削除しています。先ほどのコマンド例の一部を変更して「tr -dc "a-zA-Z0-9"」のようにすれば、大文字や数字も残すことができます。
最後に、「head」コマンドの「-c」オプションで、文字数を指定しています。「head -c 255」とすると、255文字分出力したところで処理が終了します。
次のコマンド例では、「長いパス名」を生成しています。先ほど同様、trコマンドで「a-z」以外の文字を除去してから、「fold」コマンドを使って14文字ごとに改行し、再度trコマンドで、改行(\n)を「/」に置き換えています。
FILENAME=`cat /dev/urandom | tr -dc "a-z" | fold -w 14 | tr "\n" "/" | head -c 4096
西村 めぐみ(にしむら めぐみ)
元々はDOSユーザー。ソフトハウスに勤務し生産管理のパッケージソフトウェアの開発およびサポート業務を担当、その後ライターになる。著書に『図解でわかるLinux』『らぶらぶLinuxシリーズ』『[新版 zsh&bash対応] macOSコマンド入門』『Accessではじめるデータベース超入門[改訂2版]』など。地方自治体の在宅就業支援事業にてMicrosoft Officeの教材作成およびeラーニング指導を担当。会社等の"PCヘルパー"やピンポイント研修なども行っている。
Copyright © ITmedia, Inc. All Rights Reserved.