Zuerst benutzte ich stat -c %i file
( um das Vorhandensein eines Gefängnisses zu erkennen ), was auf jeder Linux-Distribution unter der Sonne zu funktionieren schien. Unter OS X musste ich verwenden ls -i file | cut -d ' ' -f 1
.
Gibt es eine Möglichkeit, die Inode-Nummer einer Datei in einem Shell-Skript zu finden, das auf * nix-Plattformen portierbar ist und nicht von dem notorisch launischen abhängt ls
?
Antworten:
Mögliche Lösung: Die POSIX-Spezifikation für
ls
gibt an-i
, dass sie möglicherweise portabel ist. Kennt jemand eine beliebte Implementierung,ls
die dies nicht unterstützt, oder druckt sie anders als im folgenden Beispiel:quelle
stat
Befehl funktionierte nicht unter OS X, sondern unterls -di
beiden.ls
hat-d
und-i
als obligatorische Funktionen (obwohlls
selbst optional ist, wie alles andere).ls
Bei-i
Frontpads mit Leerzeichen auf mindestens Solaris 10 (möglicherweise Solaris 11 habe ich nicht überprüft). Es sieht so aus, als ob dies das traditionelle Verhalten war, das auf Unix Version 7 zurückgeht. Ich vermute, dass viele der Corporate * nix-Varianten dieses Verhalten beibehalten haben (ich habe jedoch nur Solaris 10 zur Hand). Soweit ich das beurteilen kann , ist es portabel zu erwarten, dass die erste Nicht-Leerzeichen-Zeichenfolge die Inode ist, wenn Sie etwas verwenden, das Felder in beliebigen Leerzeichen richtig abgrenzt (also nichtcut
, sondern zum Beispielawk
oder nur die eigene Feldaufteilung der Shell) Nummer.Dies sollte portabel sein und mit Dateinamen arbeiten, die Leerzeichen, Zeilenumbrüche oder andere ungerade Zeichen enthalten, was zu dem notorisch launischen ls-Verhalten führt.
quelle
Um die Portabilität zu erhöhen, können Sie auch eine plattformspezifische Wrapper-Funktion (hier genannt
statinode()
) um denstat
Befehl implementieren , die auf der Ausgabe vonuname -s
(siehe uname ) basieren kann .ls
würde nur als Fallback-Option benötigt.quelle
stat
ist Teil des GNU Coreutils- Pakets. OSX verwendet eine anderestat
Implementierung (vermutlich eine BSD-basierte), die nicht dieselben Befehlszeilenargumente verwendet.Sie können GNU Coreutils jederzeit unter OSX installieren. Das hilft natürlich nicht, wenn Sie eine Lösung benötigen, die auf OSX-Systemen ohne GNU Coreutils funktioniert.
Wenn ich die Manpage zu OSX stat (1) richtig lese ,
stat -f %i file
verhält sich OSXstat -c %i file
unter OSX wie die Coreutils-Version. (Esstat
ist eine andere Sache,stat --version >/dev/null
festzustellen, welche Version von Ihnen vorhanden ist. Sie können es versuchen . Wenn dies erfolgreich ist, haben Sie die GNU Coreutils-Version.)Die
ls -di
Lösung ist mehr tragbar und weniger Probleme, aber dies ist eine Alternative.quelle
Eine andere Lösung:
Sie können wahrscheinlich davon ausgehen, dass Perl installiert ist.
quelle
Ähnlich wie Jeffs Ansatz
stat
könnte auch direkt getestet werden.quelle