inode 번호를 찾는 휴대용 방법

inode 번호를 찾는 휴대용 방법

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

관련 정보