উত্তর:
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}'
stat
(একটি সাইট-বিস্তৃত স্ট্যান্ডার্ড) থাকতে পারে /usr/local/bin
), এবং খুব কমই উপলব্ধ অন্য কারনে।
stat -c '%U' DIR
এটি মুদ্রণ করবে UNKNOWN
যা আপনি কীভাবে দেখেন তার উপর নির্ভর করে কম সহায়ক বা আরও উপযুক্ত।
এর আউটপুট পার্সিং 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
এখানে কেন প্রয়োজনীয় তা আমি নিশ্চিত নই ।
ls
যেখানে কোনও পথে একটি নতুন লাইন দুটি লাইনকে বিভক্ত করে তোলে (যা আমি বিশ্বাস করি যে আপনি যে প্রান্তটি আবরণ করার চেষ্টা করছেন)? গনুহ উপর ls
(নবীন সংস্করণ), busybox ls
ও FreeBSD ls
একটি newline যেমন ফিরিয়ে দেওয়া হয় $'\n'
, ?
এবং ?
যথাক্রমে।
জিএনইউ অনুসন্ধানের মাধ্যমে কেউ এটি করতে পারে:
find $directoryname -maxdepth 0 -printf '%u\n'
এটি জিএনইউ সিস্টেমের বাইরে বহনযোগ্য নয়, তবে লিনাক্স বিতরণটি যেখানে কাজ করে না তা পেয়ে আমি অবাক হয়ে যাব।
find
নেই -printf
।
-printf
:-(।
খাঁটি বাশে আপনি আউটপুটটিকে 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
, কিন্তু একটি চিম্টি মধ্যে কাজ করতে পারে।