Au début, j'ai utilisé stat -c %i file
(pour aider à détecter la présence d'une prison ), qui semblait fonctionner sur n'importe quelle distribution Linux sous le soleil. Sur OS X ', je devais utiliser ls -i file | cut -d ' ' -f 1
.
Existe-t-il un moyen de trouver le numéro d'inode d'un fichier dans un script shell qui est portable sur les plates-formes * nix et ne dépend pas des notoirement capricieux ls
?
Réponses:
Solution possible: La spécification POSIX pour
ls
spécifie-i
, alors peut-être qu'elle est portable. Quelqu'un connaît-il une implémentation populairels
qui ne prend pas en charge cela ou l'imprime d'une manière différente de l'exemple suivant:la source
stat
commande ne fonctionnait pas sur OS X,ls -di
fonctionnait sur les deux.ls
a-d
et-i
comme fonctionnalités obligatoires (bien quels
lui-même soit facultatif, comme tout le reste).ls
avec des-i
front-pads avec des espaces sur au moins Solaris 10 (peut-être Solaris 11, je n'ai pas vérifié). Il semble que ce soit le comportement traditionnel remontant à la version 7 d'Unix, donc je soupçonne que de nombreuses versions d'entreprise * nix ont conservé ce comportement (je n'ai que Solaris 10 sous la main cependant). Si près que je sache, si vous utilisez quelque chose qui délimite correctement les champs dans des espaces blancs arbitraires (donc, noncut
, mais par exempleawk
ou juste le propre fractionnement des champs du shell), il est portable de s'attendre à ce que la première chaîne non blanche soit l'inode nombre.Cela devrait être portable et fonctionner avec des noms de fichiers contenant des espaces, des sauts de ligne ou d'autres caractères étranges conduisant au comportement ls notoirement capricieux .
la source
Pour augmenter la portabilité, vous pouvez également implémenter une fonction d'encapsulation spécifique à la plate-forme (appelée ici
statinode()
) autour de lastat
commande qui peut être basée sur la sortie deuname -s
(voir uname ).ls
serait nécessaire comme option de secours uniquement.la source
stat
fait partie du paquet GNU Coreutils . OSX utilise unestat
implémentation différente (vraisemblablement basée sur BSD) qui ne prend pas les mêmes arguments de ligne de commande.Vous pouvez toujours installer GNU Coreutils sur OSX. Bien sûr, cela n'aide pas si vous avez besoin d'une solution qui fonctionne sur des systèmes OSX qui n'ont pas GNU Coreutils.
Ou, si je lis correctement la page de manuel OSX stat (1) ,
stat -f %i file
sur OSX se comporte comme l'stat -c %i file
utilisation de la version Coreutils. (Déterminer quelle version destat
vous avez est une autre affaire; vous pouvez essayerstat --version >/dev/null
; si elle réussit, vous avez la version GNU Coreutils.)La
ls -di
solution est plus portable et moins problématique, mais c'est une alternative.la source
Une autre solution:
Vous pouvez probablement supposer en toute sécurité que Perl est installé.
la source
Similaire à l'approche de Jeff,
stat
pourrait également être testé directement.la source