Pada awalnya saya menggunakan stat -c %i file
(untuk membantu mendeteksi keberadaan penjara ), yang sepertinya berfungsi pada distribusi Linux di bawah matahari. Pada OS X 'saya harus menggunakan ls -i file | cut -d ' ' -f 1
.
Apakah ada beberapa cara untuk menemukan nomor inode file dalam skrip shell yang portabel di platform * nix dan tidak bergantung pada hal-hal yang berubah-ubah ls
?
Jawaban:
Solusi yang mungkin: Spesifikasi POSIX untuk
ls
ditentukan-i
, jadi mungkin itu portabel. Adakah yang tahu implementasi populerls
yang tidak mendukung ini, atau mencetaknya dengan cara yang berbeda dari contoh berikut:sumber
stat
perintah tidak bekerja pada OS X,ls -di
bekerja pada kedua.ls
memiliki-d
dan-i
sebagai fitur wajib (meskipunls
itu sendiri adalah opsional, seperti yang lainnya).ls
dengan-i
front-bantalan dengan spasi pada setidaknya Solaris 10 (mungkin Solaris 11, saya belum diperiksa). Sepertinya ini adalah perilaku tradisional yang kembali ke Unix versi 7, jadi saya curiga banyak rasa korporat * nix menjaga perilaku ini (saya hanya punya Solaris 10 di tangan). Sedekat yang saya tahu, jika Anda menggunakan sesuatu yang dengan tepat menggambarkan bidang dalam spasi putih sewenang-wenang (jadi, tidakcut
, tetapi misalnyaawk
atau hanya pemisahan bidang shell sendiri), mudah untuk mengharapkan string non-spasi putih pertama menjadi inode jumlah.Ini harus portabel dan bekerja dengan nama file yang mengandung spasi, baris baru atau karakter aneh lainnya yang mengarah ke perilaku ls yang sangat berubah-ubah .
sumber
Untuk meningkatkan portabilitas, Anda juga dapat mengimplementasikan fungsi pembungkus khusus platform (di sini disebut
statinode()
) di sekitarstat
perintah yang dapat didasarkan pada output dariuname -s
(lihat uname ).ls
akan dibutuhkan sebagai opsi mundur saja.sumber
stat
adalah bagian dari paket GNU Coreutils . OSX menggunakanstat
implementasi yang berbeda (mungkin berbasis BSD) yang tidak menggunakan argumen baris perintah yang sama.Anda selalu dapat menginstal GNU Coreutils di OSX. Tentu saja itu tidak membantu jika Anda membutuhkan solusi yang berfungsi pada sistem OSX yang tidak memiliki GNU Coreutils.
Atau, jika saya membaca halaman manual stat OSX (1) dengan benar,
stat -f %i file
OSX berperilaku sepertistat -c %i file
menggunakan versi Coreutils. (Menentukan versi yangstat
Anda miliki adalah masalah lain; Anda dapat mencobastat --version >/dev/null
; jika berhasil, Anda memiliki versi GNU Coreutils.)The
ls -di
solusi adalah lebih portabel dan lebih sedikit kesulitan, tapi ini adalah sebuah alternatif.sumber
Solusi lain:
Anda mungkin dapat dengan aman berasumsi bahwa Perl diinstal.
sumber
Mirip dengan pendekatan jeff,
stat
bisa diuji langsung juga.sumber