No começo, eu usei stat -c %i file
(para ajudar a detectar a presença de uma prisão ), que parecia funcionar em qualquer distribuição Linux sob o sol. No OS X 'eu tive que usar ls -i file | cut -d ' ' -f 1
.
Existe alguma maneira de encontrar o número de inode de um arquivo em um script de shell que seja portátil em plataformas * nix e não dependa do notoriamente caprichoso ls
?
Respostas:
Solução possível: a especificação POSIX para
ls
especifica-i
, talvez seja portátil. Alguém sabe de uma implementação popular dals
qual não oferece suporte a isso ou a imprime de maneira diferente do exemplo a seguir:fonte
stat
comando não funcionou no OS X,ls -di
funcionou em ambos.ls
possui-d
e-i
como recursos obrigatórios (emborals
ele próprio seja opcional, como todo o resto).ls
com-i
frente-pads com espaços em pelo menos Solaris 10 (possivelmente Solaris 11, eu não tenho verificado). Parece que esse era o comportamento tradicional do Unix versão 7, então eu suspeito que muitos dos sabores corporativos * nix mantiveram esse comportamento (eu só tenho o Solaris 10 em mãos). Tão perto quanto eu posso dizer, se você usar algo que delineia adequadamente os campos em espaço em branco arbitrário (então, nãocut
, mas, por exemplo,awk
ou apenas a própria divisão de campo do shell), é portátil esperar que a primeira string que não seja em branco seja o inode número.Isso deve ser portátil e funcionar com nomes de arquivos que contenham espaços, novas linhas ou outros caracteres estranhos, levando ao comportamento notoriamente caprichoso do ls.
fonte
Para aumentar a portabilidade, você também pode implementar uma função de wrapper específica da plataforma (chamada aqui
statinode()
) em torno dostat
comando que pode basear-se na saída deuname -s
(consulte uname ).ls
seria necessário apenas como uma opção de fallback.fonte
stat
faz parte do pacote GNU Coreutils . O OSX usa umastat
implementação diferente (presumivelmente baseada em BSD) que não aceita os mesmos argumentos da linha de comando.Você sempre pode instalar o GNU Coreutils no OSX. Claro que isso não ajuda se você precisar de uma solução que funcione em sistemas OSX que não possuam GNU Coreutils.
Ou, se estou lendo a página de manual OSX stat (1) corretamente,
stat -f %i file
no OSX se comporta comostat -c %i file
usar a versão Coreutils. (Determinar qual versãostat
você tem é outra questão; você pode tentarstat --version >/dev/null
; se for bem-sucedido, você tem a versão GNU Coreutils.)A
ls -di
solução é mais portátil e com menos problemas, mas essa é uma alternativa.fonte
Outra solução:
Provavelmente, você pode assumir com segurança que o Perl está instalado.
fonte
Semelhante à abordagem de jeff, também
stat
poderia ser testado diretamente.fonte