Al principio solía stat -c %i file(para ayudar a detectar la presencia de una cárcel ), que parecía funcionar en cualquier distribución de Linux bajo el sol. En OS X 'tuve que usar ls -i file | cut -d ' ' -f 1.
¿Hay alguna forma de encontrar el número de inodo de un archivo en un script de shell que es portátil en las plataformas * nix y no depende de los notoriamente caprichosos ls?

Respuestas:
Posible solución: la especificación POSIX para
lsespecifica-i, por lo que tal vez sea portátil. ¿Alguien sabe de una implementación popularlsque no sea compatible con esto, o la imprima de manera diferente al siguiente ejemplo:fuente
statcomando no funcionó en OS X,ls -difuncionó en ambos.lstiene-dy-icomo características obligatorias (aunque enlssí mismo es opcional, como todo lo demás).lscon-ifront-almohadillas con espacios en al menos Solaris 10 (posiblemente Solaris 11, no he comprobado). Parece que este era el comportamiento tradicional desde la versión 7 de Unix, por lo que sospecho que muchos de los sabores corporativos * nix mantuvieron este comportamiento (aunque solo tengo Solaris 10 disponible). Tan cerca como puedo decir, si usa algo que delimita adecuadamente los campos en espacios en blanco arbitrarios (por lo tanto, nocut, pero por ejemploawko solo la división de campos del propio shell), es portátil esperar que la primera cadena que no sea un espacio en blanco sea el inodo número.Esto debería ser portátil y funcionar con nombres de archivos que contengan espacios, líneas nuevas u otros caracteres extraños que conduzcan al comportamiento ls notoriamente caprichoso .
fuente
Para aumentar la portabilidad, también puede implementar una función de contenedor específica de la plataforma (aquí llamada
statinode()) alrededor delstatcomando que puede basarse en la salida deuname -s(ver uname ).lssería necesario solo como una opción alternativa.fuente
states parte del paquete GNU Coreutils . OSX usa unastatimplementación diferente (presumiblemente una basada en BSD) que no toma los mismos argumentos de línea de comandos.Siempre puede instalar GNU Coreutils en OSX. Por supuesto, eso no ayuda si necesita una solución que funcione en sistemas OSX que no tengan GNU Coreutils.
O, si estoy leyendo la página de manual OSX stat (1) correctamente,
stat -f %i fileen OSX se comporta como sistat -c %i fileusara la versión Coreutils. (Determinar qué versiónstattiene es otra cuestión; podría intentarlostat --version >/dev/null; si tiene éxito, tiene la versión GNU Coreutils).La
ls -disolución es más portátil y menos problemática, pero esta es una alternativa.fuente
Otra solución:
Probablemente pueda asumir con seguridad que Perl está instalado.
fuente
Similar al enfoque de jeff, también
statpodría probarse directamente.fuente