जवाबों:
stat से GNU coreutils ऐसा कर सकते हैं:
stat -c '%U' /path/of/file/or/directory
दुर्भाग्य से, के कई संस्करण हैं stat, और उनके सिंटैक्स में बहुत अधिक स्थिरता नहीं है। उदाहरण के लिए, FreeBSD पर, यह होगा
stat -f '%Su' /path/of/file/or/directory
यदि पोर्टेबिलिटी एक चिंता का विषय है, तो आप शायद बेहतर कर रहे हैं का उपयोग कर गाइल्स के सुझाव के संयोजन के lsऔर awk। इसे एक के बजाय दो प्रक्रियाएं शुरू करनी होंगी, लेकिन इसमें केवल POSIX- मानक कार्यक्षमता का उपयोग करने का लाभ है:
ls -ld /path/of/file/or/directory | awk '{print $3}'
statमें /usr/local/binया कहीं और एक अलग (साइट-वाइड मानक) हो सकता है , और शायद ही कभी उपलब्ध हो। अन्य यूनियनों पर।
stat -c '%U' DIRप्रिंट करेगा UNKNOWN, जो कि कम सहायक या अधिक उपयुक्त है, इस पर निर्भर करता है कि आप इसे कैसे देखते हैं।
के उत्पादन को पार्स करना lsशायद ही कभी एक अच्छा विचार है , लेकिन पहले कुछ क्षेत्रों को प्राप्त करना एक अपवाद है, यह वास्तव में सभी "पारंपरिक" यूनियनों पर काम करता है (यह कुछ विंडोज कार्यान्वयन जैसे प्लेटफार्मों पर काम नहीं करता है जो उपयोगकर्ता नामों में रिक्त स्थान की अनुमति देते हैं)।
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भी दुर्भाग्य से दृष्टिकोण के साथ कुछ caveats हैं , जैसा कि मैंने यहां नोट किया है । मैं अभी तक के लिए एक समाधान के साथ नहीं आया है, "लक्ष्य फ़ाइल / डीआईआर एक अलग नाम के साथ एक सहिष्णु है," मुद्दा मैंने अपनी हालिया टिप्पणी में उल्लेख किया है।
find . -user "$username" -print -prune -o -pruneआप बस कर सकते हैंfind . -maxdepth 0 -user "$username"
awk 'NR==1 {print $3}'सिर्फ के बजाय उपयोग करते हैं awk '{print $3}'? मुझे यकीन नहीं है कि NR==1यहाँ क्यों आवश्यक है।
lsजहां एक मार्ग में एक नई रेखा दो में विभाजन को विभाजित करती है (जो मुझे लगता है कि वह किनारे का मामला है जिसे आप कवर करने की कोशिश कर रहे हैं)? जीएनयू पर ls(काफ़ी नया संस्करण), बिजीबॉक्स lsऔर FreeBSD lsएक नई पंक्ति के रूप में दिया जाता है $'\n', ?और ?क्रमश:।
GNU खोज के साथ भी कोई ऐसा कर सकता है:
find $directoryname -maxdepth 0 -printf '%u\n'
यह जीएनयू प्रणाली के बाहर पोर्टेबल नहीं है, लेकिन मुझे लिनक्स वितरण खोजने में आश्चर्य होगा जहां यह काम नहीं करता है।
-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है, लेकिन एक चुटकी में काम कर सकता था।