最初は私はstat -c %i file
(刑務所の存在を検出するのを助けるために)使用しましたが、これは太陽の下でどのLinuxディストリビューションでも機能するように見えました。OS Xではを使用する必要がありましたls -i file | cut -d ' ' -f 1
。
* nixプラットフォーム間で移植可能で悪名高い気まぐれに依存しないシェルスクリプトでファイルのiノード番号を見つける方法はありますls
か?
最初は私はstat -c %i file
(刑務所の存在を検出するのを助けるために)使用しましたが、これは太陽の下でどのLinuxディストリビューションでも機能するように見えました。OS Xではを使用する必要がありましたls -i file | cut -d ' ' -f 1
。
* nixプラットフォーム間で移植可能で悪名高い気まぐれに依存しないシェルスクリプトでファイルのiノード番号を見つける方法はありますls
か?
回答:
解決策:のためのPOSIX仕様ls
指定は-i
、ので、多分それは、ポータブルです。これをサポートしls
ていない一般的な実装を知っている人や、次の例とは異なる方法で印刷する人はいますか?
$ ls -di /
2 /
stat
このコマンドは、OS X上で動作しませんでしたls -di
の両方で働いていました。
ls
が-d
あり-i
ます(ls
他のすべてと同様に、それ自体はオプションです)。
ls
で-i
、少なくともSolaris 10でスペースをフロントパッド(おそらくSolarisの11は、私がチェックしていません)。これはUnixバージョン7にさかのぼる従来の動作のようです。そのため、多くの企業* nixフレーバーがこの動作を維持していると思います(ただし、手元にあるのはSolaris 10のみです)。私が知ることができるように、任意の空白でフィールドを適切に区切る何かを使用する場合(そうではなくcut
、たとえば、awk
またはシェル自身のフィールド分割のみ)、最初の非空白文字列がiノードであると期待することは移植可能です数。
移植性を高めるためにstatinode()
、stat
コマンドの周りにプラットフォーム固有のラッパー関数(ここではと呼ばれます)を実装することもできますuname -s
(これは、unameを参照)。
ls
フォールバックオプションとしてのみ必要になります。
(
shopt -s nocasematch nullglob # using Bash
case "$(uname -s)" in
# nocasematch alternative
#[Ll][Ii][Ni][Uu][Xx] ) statinode() { stat -c '%i' "$@"; return 0; };;
"Linux" ) statinode() { stat -c '%i' "$@"; return 0; };;
"Darwin" ) statinode() { stat -f '%i' "$@"; return 0; };;
"FreeBSD" ) statinode() { stat -f '%i' "$@"; return 0; };;
* ) statinode() { ls -id "$@" | cut -d ' ' -f 1; return 0; };;
esac
#export -f statinode
statinode / / / /
shopt -u nocasematch nullglob
)
stat
GNU Coreutilsパッケージの一部です。OSXはstat
、同じコマンドライン引数をとらない別の実装(おそらくBSDベースの実装)を使用します。
OSXにはいつでもGNU Coreutilsをインストールできます。もちろん、GNU Coreutilsを持たないOSXシステムで動作するソリューションが必要な場合は、これは役に立ちません。
または、OSX stat(1)のマニュアルページを正しく読んでいる場合、OSXではCoreutilsバージョンを使用stat -f %i file
するように動作しstat -c %i file
ます。(使用しているバージョンを判別stat
することは別の問題です。試すこともできstat --version >/dev/null
ます。成功した場合は、GNU Coreutilsバージョンを使用しています。)
ls -di
ソリューションは、よりポータブルかつ少ない手間であるが、これは代替手段です。
jeffのアプローチと同様に、stat
直接テストすることもできます。
(
if (stat -c '%i' / 1>/dev/null 2>&1; exit $?); then
statinode() { stat -c '%i' "$@"; return 0; }
elif (stat -f '%i' / 1>/dev/null 2>&1; exit $?); then
statinode() { stat -f '%i' "$@"; return 0; }
elif test -n "$(exec 2>/dev/null; ls -id / | cut -d ' ' -f 1)"; then
statinode() { ls -id "$@" | cut -d ' ' -f 1; return 0; }
else
echo 'Could not create statinode(). Exiting ...' && exit 1
fi
# export -f statinode
statinode / / / /
declare -f statinode
)