最初に私はstat -c %i file
(助けるために)刑務所の存在を検知)、すべてのLinuxディストリビューションで動作するようです。 OS Xではls -i file | cut -d ' ' -f 1
。
* nixプラットフォームで移植可能で悪名高い気まぐれに頼らないシェルスクリプトでファイルのinode番号を見つける方法はありますかls
?
答え1
考えられる解決策:POSIX仕様ls
指定されているため、-i
移植性がある可能性があります。一般的なls
実装について知っている人はいますか?いいえこれをサポートするか、次の例とは異なる方法で印刷してください。
$ ls -di /
2 /
答え2
これは移植可能でなければならず、スペース、改行、またはその他の奇妙な文字を含むファイル名を処理できます。気まぐれで悪名高い笑
filename="whatever file name"
find . -name "$filename" -exec sh -c 'ls -di "$0" | head -1' {} \;
答え3
移植性を向上させるために、コマンドの周りにプラットフォーム固有のラッパー関数(ここで呼び出すstatinode()
)を実装するstat
こともできますuname -s
。名前を明らかにする)。
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
)
答え4
別の解決策:
#!/usr/bin/perl
use strict;
use warnings;
die "Usage: $0 filename\n" if scalar @ARGV != 1;
my $file = $ARGV[0];
my @stat = stat $file;
die "$file: $!\n" if not @stat;
print "$stat[1]\n";
Perlがインストールされていると安全に想定できます。