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
ls
especifica-i
, por lo que tal vez sea portátil. ¿Alguien sabe de una implementación popularls
que no sea compatible con esto, o la imprima de manera diferente al siguiente ejemplo:fuente
stat
comando no funcionó en OS X,ls -di
funcionó en ambos.ls
tiene-d
y-i
como características obligatorias (aunque enls
sí mismo es opcional, como todo lo demás).ls
con-i
front-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 ejemploawk
o 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 delstat
comando que puede basarse en la salida deuname -s
(ver uname ).ls
sería necesario solo como una opción alternativa.fuente
stat
es parte del paquete GNU Coreutils . OSX usa unastat
implementació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 file
en OSX se comporta como sistat -c %i file
usara la versión Coreutils. (Determinar qué versiónstat
tiene es otra cuestión; podría intentarlostat --version >/dev/null
; si tiene éxito, tiene la versión GNU Coreutils).La
ls -di
solució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
stat
podría probarse directamente.fuente