ইনোড নম্বর খুঁজতে পোর্টেবল উপায়


10

প্রথমে আমি stat -c %i file( কারাগারের উপস্থিতি সনাক্ত করতে সহায়তা করার জন্য ) ব্যবহার করেছি, যা দেখে মনে হয়েছিল যে এটি কোনও সূর্যের নীচে লিনাক্স বিতরণে কাজ করে। ওএস এক্সে আমাকে ব্যবহার করতে হয়েছিল ls -i file | cut -d ' ' -f 1

শেল স্ক্রিপ্টে এমন কোনও ফাইলের ইনোড নম্বর খুঁজে পাওয়ার কোনও উপায় আছে যা * নিক্স প্ল্যাটফর্ম জুড়ে বহনযোগ্য এবং কুখ্যাত কৌতূহলের উপর নির্ভর করে না ls?


1
আপনার আগ্রহী হতে পারে, বা এর জন্য আরও ভাল উত্তর থাকতে পারে, আমি কীভাবে বলব যে আমি একটি ক্রুটে চালাচ্ছি?
গিলস 'তাই খারাপ হওয়া বন্ধ করুন'

আপনি কি "কুখ্যাত কৌতুকপূর্ণ এলএস" সম্পর্কে বিস্তারিত বলতে পারেন?
jlliagre

@ জেলিয়াগ্র্রে: অন্যরা ইতিমধ্যে এটি আরও ভাল করেছে।
l0b0

ঠিক আছে, এই জাতীয় ফাইলগুলির জন্য, আমার উত্তর দেখুন।
jlliagre

উত্তর:


11

সম্ভাব্য সমাধান: সুনির্দিষ্ট জন্য পসিক্স স্পেসls-i , তাই সম্ভবত এটি বহনযোগ্য। এমন কোনও জনপ্রিয় বাস্তবায়ন সম্পর্কে কেউ কি জানেন lsযা এর সমর্থন করে না , বা নীচের উদাহরণ থেকে আলাদাভাবে মুদ্রণ করেছেন:

$ ls -di /
2 /

3
@ জেলিয়াগ্রে: পোস্ট করার আগে দয়া করে পড়ুন। statকমান্ড OS X এর উপর কাজ না করে, ls -diউভয় কাজ করতেন।
l0b0

1
এমনকি ব্যাসিবক্সের lsরয়েছে -dএবং -iবাধ্যতামূলক বৈশিষ্ট্যগুলি (যদিও এটি lsনিজেই অন্যান্য বিষয়গুলির মতো optionচ্ছিক )।
গিলস 'এস-অশুভ হওয়া বন্ধ করুন'

1
মাইকেল ভুল বোঝাবুঝি আমি মন্তব্য করছি ঠিক কি ছিল। মন্তব্য পোস্ট করার আগে এটি বেশ অভদ্র এবং অপ্রয়োজনীয় নয়।
jlliagre

2
এর ব্যতিক্রম রয়েছে : কমপক্ষে সোলারিস 10 এ স্পেস lsসহ -iফ্রন্ট-প্যাড সহ (সম্ভবত সোলারিস 11, আমি পরীক্ষা করে দেখিনি)। দেখে মনে হচ্ছে এটি theতিহ্যবাহী আচরণটি ইউনিক্স সংস্করণ to-এ ফিরে আসছিল, তাই আমি সন্দেহ করি যে অনেক কর্পোরেট * নিক্স ফ্লেভার এই আচরণটি চালিয়েছে (যদিও আমি সোলারিসকে কেবল হাতে পেয়েছি 10)) আমি যেমন বলতে পারি তার কাছাকাছি, আপনি যদি এমন কিছু ব্যবহার করেন যা স্বেচ্ছাসেবী ক্ষেত্রের ক্ষেত্রে ক্ষেত্রগুলি সঠিকভাবে বর্ণিত করে (তাই না cut, তবে উদাহরণস্বরূপ awkবা কেবল শেলের নিজস্ব ক্ষেত্র-বিভাজন), এটি প্রথম অ-হোয়াইটস্পেস স্ট্রিংটিকে ইনোড হিসাবে প্রত্যাশা করা বহনযোগ্য সংখ্যা।
mtraceur

1
@ l0b0 হ্যাঁ এর জন্য মস্কোস্টিক উত্সর্গ প্রয়োজন: অবিচ্ছিন্ন রিটার্নের জন্য একগুচ্ছ অধ্যয়ন / পরীক্ষা এবং মুখস্তকরণ। এটি সম্ভব, কমপক্ষে "পোর্টেবল" এর কিছু সংজ্ঞার জন্য, তবে এটি একটি আনন্দদায়ক অভিজ্ঞতা নয়।
mtraceur

2

এটি পোর্টেবল হতে হবে এবং ফাঁকা স্থান, নিউলাইনগুলি বা অন্যান্য বিজোড় অক্ষরযুক্ত ফাইলের নামগুলির সাথে কাজ করা উচিত যা কুখ্যাত মজাদার ls আচরণের দিকে পরিচালিত করে।

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

1

পোর্টেবিলিটি বাড়াতে আপনি কমান্ডের statinode()চারপাশে প্ল্যাটফর্ম-নির্দিষ্ট র‍্যাপার ফাংশন (এখানে বলা হয় ) statপ্রয়োগ করতে পারেন যা আউটপুট uname -s( অকেম দেখুন ) এর উপর ভিত্তি করে তৈরি করা যেতে পারে ।

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 প্যাকেজের অংশ । ওএসএক্স একটি পৃথক statবাস্তবায়ন ব্যবহার করে (সম্ভবত বিএসডি ভিত্তিক একটি) যা একই কমান্ড-লাইন আর্গুমেন্ট গ্রহণ করে না।

আপনি সর্বদা ওএসএক্সে জিএনইউ কোরিটিল ইনস্টল করতে পারেন। অবশ্যই আপনার যদি এমন কোনও সমাধানের প্রয়োজন হয় যা ওএসএক্স সিস্টেমে কাজ করে যা GNU Coreutils নেই help

অথবা, যদি আমি ওএসএক্স স্ট্যাটাস (1) ম্যান পৃষ্ঠাটি সঠিকভাবে পড়ছি, তবে ওএসএক্সে কোরিটিলস সংস্করণ ব্যবহার করার stat -f %i fileমতো আচরণ 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
)
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.