처음에 나는 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이 설치되어 있다고 안전하게 가정할 수 있습니다.