Początkowo korzystałem stat -c %i file
(aby wykryć obecność więzienia ), który zdawał się działać na dowolnej dystrybucji Linuksa pod słońcem. Na OS X 'musiałem użyć ls -i file | cut -d ' ' -f 1
.
Czy jest jakiś sposób na znalezienie numeru i-węzła pliku w skrypcie powłoki, który jest przenośny na platformach * nix i nie zależy od notorycznie kapryśnych ls
?
Odpowiedzi:
Możliwe rozwiązanie: specyfikacja POSIX dla
ls
specyfikacji-i
, więc może jest przenośna. Czy ktoś wie o popularnej implementacji,ls
która tego nie obsługuje, lub drukuje ją w inny sposób niż w poniższym przykładzie:źródło
stat
Komenda nie działa na OS X,ls -di
pracował na obu.ls
ma-d
i-i
jako obowiązkowe funkcje (chociażls
sam jest opcjonalny, jak wszystko inne).ls
z-i
przednich-klocki ze spacjami na co najmniej 10 (ewentualnie Solaris Solaris 11, nie mam zaznaczone). Wygląda na to, że było to tradycyjne zachowanie wracające do Uniksa w wersji 7, więc podejrzewam, że wiele korporacyjnych smaków * nix zachowało to zachowanie (ale mam tylko Solaris 10 pod ręką). Tak blisko, jak mogę powiedzieć, jeśli użyjesz czegoś, co poprawnie wyznacza pola w dowolnym spacji (więc niecut
, ale na przykładawk
lub po prostu własne dzielenie pól powłoki), przenośne jest oczekiwanie, że pierwszy ciąg niebiałych znaków będzie i-węzłem numer.Powinno to być przenośne i współpracować z nazwami plików zawierającymi spacje, znaki nowej linii lub inne dziwne znaki, prowadzące do notorycznie kapryśnego zachowania ls.
źródło
Aby zwiększyć przenośność, możesz także zaimplementować specyficzną dla platformy funkcję otoki (tutaj nazywaną
statinode()
) wokółstat
polecenia, która może być oparta na danych wyjściowychuname -s
(zobacz uname ).ls
byłoby potrzebne tylko jako opcja rezerwowa.źródło
stat
jest częścią pakietu GNU Coreutils . OSX używa innejstat
implementacji (prawdopodobnie opartej na BSD), która nie przyjmuje tych samych argumentów wiersza poleceń.Zawsze możesz zainstalować GNU Coreutils na OSX. Oczywiście to nie pomaga, jeśli potrzebujesz rozwiązania, które działa na systemach OSX, które nie mają GNU Coreutils.
Lub, jeśli poprawnie czytam stronę podręcznika stat OSX stat (1) ,
stat -f %i file
w OSX zachowuje się jakstat -c %i file
przy użyciu wersji Coreutils. (Określenie, którą wersjęstat
posiadasz, to inna sprawa; możesz spróbowaćstat --version >/dev/null
; jeśli się powiedzie, masz wersję GNU Coreutils).ls -di
Rozwiązanie jest bardziej mobilny i mniej kłopotów, ale jest to alternatywa.źródło
Inne rozwiązanie:
Prawdopodobnie możesz bezpiecznie założyć, że Perl jest zainstalowany.
źródło
Podobnie do podejścia Jeffa,
stat
można go również przetestować bezpośrednio.źródło