ডিরেক্টরি বা ফাইলের মালিক সন্ধান করুন, তবে কেবল এটি এবং অন্য কিছু নয়


62

আমি এমন একটি কমান্ড সন্ধান করছি যা কোনও ডিরেক্টরিতে মালিককে ফেরত দেবে এবং কেবল এটিই - যেমন কোনও রেজেক্স ls -latকমান্ডটি পার্স করছে বা এর মতো কিছু? আমি ফলাফলটি অন্য স্ক্রিপ্টে ব্যবহার করতে চাই।

উত্তর:


102

statজিএনইউ থেকে কোর্টিলগুলি এটি করতে পারে:

stat -c '%U' /path/of/file/or/directory

দুর্ভাগ্যক্রমে, এর অনেকগুলি সংস্করণ রয়েছে statএবং তাদের বাক্য গঠনে অনেকগুলি ধারাবাহিকতা নেই। উদাহরণস্বরূপ, ফ্রিবিএসডি-তে এটি হবে

stat -f '%Su' /path/of/file/or/directory

তাহলে বহনযোগ্যতা একটি উদ্বেগের বিষয়, আপনি সম্ভবত ভালো আছেন ব্যবহার গিলেজ এর পরামর্শ মিশ্রন lsএবং awk। এটির পরিবর্তে দুটি প্রক্রিয়া শুরু করতে হবে তবে এটিতে কেবল পসিএক্স-মানক কার্যকারিতা ব্যবহার করার সুবিধা রয়েছে:

ls -ld /path/of/file/or/directory | awk '{print $3}'

2
স্ট্যাটিক -c% ইউ / পাথ, যদি ব্রেভিটি বোনাস হয়।
tsvallender

1
এটি জিএনইউ স্ট্যাটকে ধরে নিয়েছে, এটি পুরানো লিনাক্স সিস্টেমগুলির ক্ষেত্রে নয় (এমনকি নতুন সিস্টেমেও আমি সতর্ক থাকব, ব্যবহারকারীর বাড়িতে বা অন্য কোথাও কোনও আলাদা stat(একটি সাইট-বিস্তৃত স্ট্যান্ডার্ড) থাকতে পারে /usr/local/bin), এবং খুব কমই উপলব্ধ অন্য কারনে।
গিলস

1
stat -c %Uকমান্ডটি সংকলিত থাকলে বুসিবক্সের সাথেও কাজ করার সুবিধা রয়েছেstat
গিলস

1
চমৎকার, শেষ উদাহরণ (
এলএস

1
মনে রাখবেন যে কোনও স্থানীয় ব্যবহারকারী যদি মালিকের সাথে মেলে না, তবে এলএস ইউডিটি মুদ্রণ করবে (উদাহরণস্বরূপ, একটি নেটওয়ার্ক শেয়ারে), তবে stat -c '%U' DIRএটি মুদ্রণ করবে UNKNOWNযা আপনি কীভাবে দেখেন তার উপর নির্ভর করে কম সহায়ক বা আরও উপযুক্ত।
বেসিক 6

18

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

ls -ld /path/to/directory | awk 'NR==1 {print $3}'

আর একটি বিকল্প হ'ল statকমান্ড ব্যবহার করা , তবে statশেল থেকে সমস্যাটি হ'ল বিভিন্ন সিনট্যাক্স সহ একাধিক কমান্ড রয়েছে, সুতরাং statশেল স্ক্রিপ্টে অপ্রিয়যোগ্য (এমনকি লিনাক্স ইনস্টলেশন জুড়ে)।

নোট করুন যে প্রদত্ত ব্যবহারকারীর মালিক কিনা তা পরীক্ষা করা আলাদা প্রস্তাব।

if [ -n "$(find . -user "$username" -print -prune -o -prune)" ]; then
  echo "The current directory is owned by $username."
fi
if [ -n "$(find . -user "$(id -u)" -print -prune -o -prune)" ]; then
  echo "The current directory is owned by the current user."
fi

ls | awkদুর্ভাগ্যক্রমে এই পদ্ধতির সাথে কিছু সতর্কতা রয়েছে , যেমনটি আমি এখানে উল্লেখ করেছি । আমি আমার সাম্প্রতিক মন্তব্যে উল্লেখ করেছি, "টার্গেট ফাইল / ডির একটি আলাদা নামের একটি সিমিলিঙ্ক," এর জন্য আমি এখনও কোনও সমাধান নিয়ে আসিনি।
বোরপোরার

পরিবর্তে find . -user "$username" -print -prune -o -pruneআপনি কেবল করতে পারেনfind . -maxdepth 0 -user "$username"
নিক্লাস হলাম

@ গিলস আপনি কি ন্যায়বিচারের awk 'NR==1 {print $3}'পরিবর্তে ব্যবহার করার কোনও কারণ আছে awk '{print $3}'? NR==1এখানে কেন প্রয়োজনীয় তা আমি নিশ্চিত নই ।
হ্যারল্ড ফিশার

1
@ হারল্ডফিশার কেবল একটি প্রান্ত ক্ষেত্রে যেখানে পাথটিতে একটি নতুন লাইন রয়েছে। এটি খুব কমই প্রয়োজনীয়, তবে কখনও ক্ষতিকারক নয়।
গিলস

@ জিলস জেনে খুব ভাল !! কেবল কৌতূহলী, আপনি কি কোনও বাস্তবায়নের বিষয়ে অবগত আছেন lsযেখানে কোনও পথে একটি নতুন লাইন দুটি লাইনকে বিভক্ত করে তোলে (যা আমি বিশ্বাস করি যে আপনি যে প্রান্তটি আবরণ করার চেষ্টা করছেন)? গনুহ উপর ls(নবীন সংস্করণ), busybox lsও FreeBSD lsএকটি newline যেমন ফিরিয়ে দেওয়া হয় $'\n', ?এবং ?যথাক্রমে।
হ্যারল্ড ফিশার

9

জিএনইউ অনুসন্ধানের মাধ্যমে কেউ এটি করতে পারে:

find $directoryname -maxdepth 0 -printf '%u\n'

এটি জিএনইউ সিস্টেমের বাইরে বহনযোগ্য নয়, তবে লিনাক্স বিতরণটি যেখানে কাজ করে না তা পেয়ে আমি অবাক হয়ে যাব।


1
এটি প্রতিটি অ-এমবেডেড লিনাক্স সিস্টেম এবং আরও কয়েকজনকে (যেমন সাইগউইন) কাজ করে। এম্বেড থাকা সিস্টেমে ব্যাসিবক্স থাকতে পারে , যার findনেই -printf
গিলস

আমি যেমন বলেছি, জিএনইউ সিস্টেম।
ম্যাচটিএম

জিএনইউ কোর্টিলসবিহীন সিস্টেমে (যেমন ফ্রিবিএসডি) নেই -printf:-(।
পেভিক

@ পেভিক হ্যাঁ, আমি যেমন বলেছিলাম, এখনও। আপনার প্রয়োজন হলে আপনি GNU ইনস্টল করতে পারেন। :)
ম্যাটডেম

@ ম্যাটডেম: সর্বদা নয় :-(। সবচেয়ে গুরুত্বপূর্ণ আপনি যখন স্ক্রিপ্টগুলি পোর্টেবল হতে হবে সেগুলি লিখুন
পেরভিক

2

খাঁটি বাশে আপনি আউটপুটটিকে lsএকটি অ্যারে এবং সূচকে রূপান্তর করতে পারবেন ।

# (lrwxr-xr-x, 1, myuser, staff, 36, Oct, 21, 16:36, /path/to/file)    
file_meta=($(ls -ld /path/to/file))
file_owner="${file_meta[2]}" # myuser

এটি ব্যবহার হিসাবে হিসাবে মার্জিত নয় stat, findঅথবা awk, কিন্তু একটি চিম্টি মধ্যে কাজ করতে পারে।

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.