ฉันกำลังมองหาคำสั่งที่จะส่งคืนเจ้าของไดเรกทอรีและเฉพาะที่ - เช่น regex แยกls -lat
คำสั่งหรือสิ่งที่คล้ายกัน? ฉันต้องการใช้ผลลัพธ์ในสคริปต์อื่น
ฉันกำลังมองหาคำสั่งที่จะส่งคืนเจ้าของไดเรกทอรีและเฉพาะที่ - เช่น regex แยกls -lat
คำสั่งหรือสิ่งที่คล้ายกัน? ฉันต้องการใช้ผลลัพธ์ในสคริปต์อื่น
คำตอบ:
stat
จากcoreutils ของ GNUสามารถทำได้:
stat -c '%U' /path/of/file/or/directory
น่าเสียดายที่มีหลายเวอร์ชันstat
และมีความสอดคล้องกันไม่มากนักในไวยากรณ์ ตัวอย่างเช่นใน FreeBSD มันจะเป็น
stat -f '%Su' /path/of/file/or/directory
ถ้าพกพาเป็นกังวลคุณอาจดีกว่าการใช้ข้อเสนอแนะ Gilles ของการรวมและls
awk
ต้องเริ่มต้นสองกระบวนการแทนหนึ่ง แต่มีข้อได้เปรียบของการใช้ฟังก์ชันมาตรฐาน POSIX เท่านั้น:
ls -ld /path/of/file/or/directory | awk '{print $3}'
stat
(มาตรฐานทั่วทั้งไซต์) ใน/usr/local/bin
หรือที่อื่น ๆ ในบ้านของผู้ใช้) และไม่ค่อยมี ในเรื่องอื่น ๆ
stat -c '%U' DIR
จะพิมพ์UNKNOWN
ซึ่งมีประโยชน์น้อยกว่าหรือเหมาะสมกว่าขึ้นอยู่กับว่าคุณดูอย่างไร
การแยกเอาท์พุทของls
ไม่ค่อยเป็นความคิดที่ดีแต่การได้รับสองสามฟิลด์แรกนั้นเป็นข้อยกเว้นมันใช้งานได้จริงกับ "ดั้งเดิม" ทุก unices (มันไม่ทำงานบนแพลตฟอร์มเช่นการใช้งาน Windows บางประเภทที่อนุญาตให้มีช่องว่างในชื่อผู้ใช้)
ls -ld /path/to/directory | awk 'NR==1 {print $3}'
อีกทางเลือกหนึ่งคือการใช้stat
คำสั่ง แต่ปัญหาstat
จากเชลล์คือมีหลายคำสั่งที่มีไวยากรณ์แตกต่างกันดังนั้นstat
ในเชลล์สคริปต์จะไม่สามารถย้ายได้ (แม้ในการติดตั้ง Linux)
โปรดทราบว่าการทดสอบว่าผู้ใช้ที่กำหนดเป็นเจ้าของนั้นเป็นข้อเสนอที่แตกต่างกันหรือไม่
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
วิธีการที่น่าเสียดายมากเกินไปในขณะที่ผมเคยตั้งข้อสังเกตที่นี่ ฉันยังไม่ได้หาวิธีแก้ปัญหาสำหรับ "เป้าหมายไฟล์ / dir เป็น symlink ด้วยชื่ออื่น" ปัญหาที่ฉันพูดถึงในความคิดเห็นล่าสุดของฉัน
find . -user "$username" -print -prune -o -prune
ทำอย่างfind . -maxdepth 0 -user "$username"
awk 'NR==1 {print $3}'
แทนที่จะawk '{print $3}'
ใช่ไหม? ฉันไม่แน่ใจว่าทำไมจึงNR==1
จำเป็นที่นี่
ls
บรรทัดใหม่ในเส้นทางทำให้เส้นแบ่งออกเป็นสองส่วน (ซึ่งฉันเชื่อว่าเป็นกรณีขอบที่คุณพยายามครอบคลุม) ที่ GNU ls
(รุ่นค่อนข้างใหม่) BusyBox ls
และ FreeBSD ls
ขึ้นบรรทัดใหม่ถูกส่งกลับเป็น$'\n'
, ?
และ?
ตามลำดับ
ท่านสามารถทำได้ด้วย GNU พบ:
find $directoryname -maxdepth 0 -printf '%u\n'
นี่ไม่ใช่แบบพกพานอกระบบ GNU แต่ฉันประหลาดใจที่พบการกระจาย Linux ที่ใช้งานไม่ได้
-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
แต่สามารถทำงานในหยิก