इनोड संख्या ज्ञात करने का पोर्टेबल तरीका


10

सबसे पहले मैंने उपयोग किया stat -c %i file( एक जेल की उपस्थिति का पता लगाने में मदद करने के लिए ), जो सूरज के नीचे किसी भी लिनक्स वितरण पर काम करता था। OS X 'पर मुझे इस्तेमाल करना था ls -i file | cut -d ' ' -f 1

क्या शेल स्क्रिप्ट में किसी फ़ाइल की इनकोड संख्या को खोजने का कोई तरीका है जो कि * निक्स प्लेटफॉर्म पर पोर्टेबल है और कुख्यात कैपिटल पर निर्भर नहीं है ls?


1
आप में रुचि हो सकती है, या आपके पास बेहतर उत्तर हो सकते हैं, मैं कैसे बताऊं कि मैं चिरोट में चल रहा हूं?
गिल्स एसओ-

क्या आप "कुख्यात मकर राशि" के बारे में विस्तार से बता सकते हैं?
जुलियाग्रे

@ जल्लीगर: दूसरों ने इसे पहले से बेहतर किया है
l0b0

ठीक है, ऐसी फ़ाइलों के लिए, मेरा उत्तर देखें।
जूलियाग्रे

जवाबों:


11

संभावित समाधान: POSIX युक्तिls निर्दिष्ट करता है -i, इसलिए शायद यह पोर्टेबल है। क्या कोई लोकप्रिय कार्यान्वयन के बारे में जानता है lsजो इसका समर्थन नहीं करता है , या इसे निम्नलिखित उदाहरण से अलग तरीके से प्रिंट करता है:

$ ls -di /
2 /

3
@ जल्लीगर: पोस्ट करने से पहले पढ़िए। statआदेश ओएस एक्स पर काम नहीं किया, ls -diदोनों पर काम किया।
l0b0

1
यहां तक ​​कि बिजीबॉक्स lsमें -dऔर -iअनिवार्य सुविधाओं के रूप में (हालांकि lsखुद वैकल्पिक है, बाकी सब तरह)।
गिल्स एसओ- बुराई को रोकना '

1
माइकल गलतफहमी ठीक था कि मैं क्या टिप्पणी कर रहा था। यह एक काफी अशिष्ट और अवांछनीय "टिप्पणी पोस्ट करने से पहले पढ़ा" लायक नहीं है।
जॉलीग्रे

2
वहाँ रहे हैं : इस के लिए अपवाद lsके साथ -iकम से कम Solaris 10 (संभवतः सोलारिस 11, मैं जांच न की हो) पर रिक्त स्थान के साथ सामने के पैड। ऐसा लगता है कि यह पारंपरिक व्यवहार यूनिक्स संस्करण 7 में वापस जा रहा था, इसलिए मुझे बहुत सारे कॉरपोरेट * निक्स स्वादों पर संदेह है (मैंने केवल सोलारिस 10 ऑन-हैंड हैं)। इसलिए जैसा कि मैं बता सकता हूं, यदि आप किसी ऐसी चीज का उपयोग करते हैं जो मनमाने ढंग से व्हॉट्सएप में खेतों को ठीक से डिलिनेट करती है (तो, नहीं cut, लेकिन उदाहरण के लिए awkया सिर्फ शेल के अपने फील्ड-बंटवारे के लिए), यह पहला गैर-व्हाट्सएप स्ट्रिंग की उम्मीद है कि पोर्टेबल है नंबर।
5

1
@ l0b0 हाँ। इसके लिए मर्दवादी समर्पण की आवश्यकता होती है: लगातार कम होते रिटर्न के लिए अध्ययन / परीक्षण और संस्मरण का एक समूह। यह संभव है, कम से कम "पोर्टेबल" की कुछ परिभाषा के लिए, लेकिन यह एक सुखद अनुभव नहीं है।
17

2

यह पोर्टेबल होना चाहिए और रिक्त स्थान, newlines या अन्य विषम वर्णों वाले फ़ाइल नामों के साथ काम करना चाहिए जो कुख्यात रूप से लचर व्यवहार करते हैं।

filename="whatever file name"
find . -name "$filename" -exec sh -c 'ls -di "$0" | head -1' {} \;

1

पोर्टेबिलिटी को बढ़ाने के लिए आप भी एक प्लेटफ़ॉर्म-विशिष्ट आवरण समारोह (यहाँ बुलाया लागू कर सकते हैं statinode()) के आसपास statआदेश के उत्पादन के आधार पर किया जा सकता है कि uname -s(देखें uname )।

ls केवल एक विकल्प के रूप में गिरावट की आवश्यकता होगी।

(
shopt -s nocasematch nullglob    # using Bash
case "$(uname -s)" in
   # nocasematch alternative
   #[Ll][Ii][Ni][Uu][Xx]   )  statinode() { stat -c '%i' "$@"; return 0; };;
   "Linux"   )      statinode() { stat -c '%i' "$@"; return 0; };;
   "Darwin"  )      statinode() { stat -f '%i' "$@"; return 0; };;
   "FreeBSD" )      statinode() { stat -f '%i' "$@"; return 0; };;
           * )      statinode() { ls -id "$@" | cut -d ' ' -f 1; return 0; };;
esac
#export -f statinode
statinode / / / /
shopt -u nocasematch nullglob
)

0

statGNU Coreutils पैकेज का हिस्सा है । OSX एक अलग statकार्यान्वयन (संभवतः बीएसडी-आधारित एक) का उपयोग करता है जो समान कमांड-लाइन तर्क नहीं लेता है।

आप हमेशा OSX पर GNU Coreutils स्थापित कर सकते हैं। बेशक, अगर आपको एक समाधान की आवश्यकता नहीं है जो OSX सिस्टम पर काम करता है जिसमें GNU Coreutils नहीं है।

या, यदि मैं OSX स्टेट (1) मैन पेज को सही ढंग से पढ़ रहा हूं, तो stat -f %i fileOSX stat -c %i fileकोरुटिल्स संस्करण का उपयोग करने जैसा व्यवहार करता है । ( statआपके पास कौन सा संस्करण है यह निर्धारित करना एक और मामला है; आप कोशिश कर सकते हैं stat --version >/dev/null; यदि यह सफल होता है, तो आपके पास जीएनयू कोरुटेट्स संस्करण है।)

ls -diसमाधान अधिक पोर्टेबल और कम परेशानी है, लेकिन इस एक विकल्प है।


0

एक और समाधान:

#!/usr/bin/perl

use strict;
use warnings;

die "Usage: $0 filename\n" if scalar @ARGV != 1;
my $file = $ARGV[0];
my @stat = stat $file;
die "$file: $!\n" if not @stat;
print "$stat[1]\n";

आप शायद सुरक्षित रूप से मान सकते हैं कि पर्ल स्थापित है।


0

जेफ के दृष्टिकोण के समान, statसीधे भी परीक्षण किया जा सकता है।

(
if (stat -c '%i' / 1>/dev/null 2>&1; exit $?); then
   statinode() { stat -c '%i' "$@"; return 0; }
elif (stat -f '%i' / 1>/dev/null 2>&1; exit $?); then
   statinode() { stat -f '%i' "$@"; return 0; }
elif test -n "$(exec 2>/dev/null; ls -id / | cut -d ' ' -f 1)"; then
   statinode() { ls -id "$@" | cut -d ' ' -f 1; return 0; }
else
   echo 'Could not create statinode(). Exiting ...' && exit 1
fi
# export -f statinode
statinode / / / /
declare -f statinode
)
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.