जवाबों:
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
है, लेकिन एक चुटकी में काम कर सकता था।