아이 노드 번호를 찾는 휴대용 방법


10

처음에는 stat -c %i file( 감옥의 존재를 감지하는 데 도움이 됨) 사용 했는데, 이는 태양 아래 어떤 Linux 배포에서도 작동하는 것 같습니다. OS X '에서는을 사용해야했습니다 ls -i file | cut -d ' ' -f 1.

쉘 스크립트에서 파일의 inode 번호를 찾는 방법이 있습니까? * nix 플랫폼에서 이식 가능하며 악명 높은 변덕에 의존하지 ls않습니까?


1
당신은에 관심이있는, 또는 더 나은 해답이 될 수 있습니다 어떻게 내가 chroot에서 실행 해요 알 수 있습니까를? .
Gilles 'SO- 악마 중지

"명백하게 변덕스러운 ls"에 대해 자세히 설명해 주시겠습니까?
jlliagre

@jlliagre : 다른 사람들은 이미 더 잘 했습니다 .
l0b0

좋아요, 그런 파일에 대해서는 답장을 참조하십시오.
jlliagre

답변:


11

가능한 해결책 :의 POSIX 사양은ls 지정 -i하므로 이식성이 있습니다. 누구든지 ls이것을 구현 하지 않는 인기있는 구현을 알고 있거나 다음 예제와 다른 방식으로 인쇄합니다.

$ ls -di /
2 /

3
@jlliagre : 게시하기 전에 읽으십시오. 이 stat명령은 OS X에서 작동하지 않았으며 ls -di두 가지 모두 에서 작동했습니다.
l0b0

1
심지어 비지 박스는 ls가지고 -d-i필수 기능으로 (비록 ls그 자체가 다른 모든 것들처럼, 선택 사항입니다).
Gilles 'SO- 악마 그만해

1
마이클 오해는 내가 정확히 말한 내용이었습니다. 그것은 매우 무례하고 가치가없는 "게시하기 전에 읽은"댓글의 가치가 없습니다.
jlliagre

2
있습니다 :이 예외 ls-i(아마도 솔라리스 11, 내가 확인하지 않은) 적어도 Solaris 10의 공백 전면 패드. 이것이 유닉스 버전 7로 돌아가는 전통적인 행동 인 것처럼 보이므로 많은 기업 * nix 맛 이이 행동을 유지했다고 생각합니다 (Solaris 10 만 보유하고 있음). 내가 알 수 있듯이 임의의 공백 ( cut예 : awk셸이 아닌 쉘 자체 필드 분할) 에서 필드를 올바르게 묘사하는 것을 사용하면 공백이 아닌 첫 번째 문자열이 inode가 될 것으로 기대할 수 있습니다. 번호.
mtraceur

1
@ l0b0 예. 지속적으로 감소하는 수익을위한 많은 연구 / 테스트 및 암기 : 그것은 마조히즘 적 헌신이 필요합니다. 적어도 "휴대용"이라는 정의는 가능하지만 즐거운 경험은 아닙니다.
mtraceur

2

이것은 이식 가능해야하며 공백, 줄 바꿈 또는 기타 이상한 문자가 포함 된 파일 이름으로 작동하여 악명 높은 변덕스러운 ls 동작을 유발합니다 .

filename="whatever file name"
find . -name "$filename" -exec sh -c 'ls -di "$0" | head -1' {} \;

1

이식성을 높이기 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
)

0

statGNU 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솔루션은 이식성이 높고 문제가 적지 만 대안입니다.


0

다른 해결책 :

#!/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이 설치되었다고 가정해도됩니다.


0

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
)
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.