यहाँ प्रश्न का उत्तर है Y (अनदेखी सवाल एक्स ), ओ पी के प्रयास से प्रेरित:
#!/bin/bash
LC_COLLATE=C
while read ls_out
do
extra=0
perms=0
for i in {1..9}
do
# Shift $perms to the left one bit, so we can always just add the LSB.
let $((perms*=2))
this_char=${ls_out:i:1}
# If it's different from its upper case equivalent,
# it's a lower case letter, so the bit is set.
# Unless it's "l" (lower case L), which is special.
if [ "$this_char" != "${this_char^}" ] && [ "$this_char" != "l" ]
then
let $((perms++))
fi
# If it's not "r", "w", "x", or "-", it indicates that
# one of the high-order (S/s=4000, S/s/L/l=2000, or T/t=1000) bits
# is set.
case "$this_char" in
([^rwx-])
let $((extra += 2 ** (3-i/3) ))
esac
done
printf "%o%.3o\n" "$extra" "$perms"
done
उपर्युक्त में कुछ बाशिंदे शामिल हैं। निम्नलिखित संस्करण POSIX- संगत प्रतीत होता है:
#!/bin/sh
LC_COLLATE=C
while read ls_out
do
extra=0
perms=0
for i in $(seq 1 9)
do
# Shift $perms to the left one bit, so we can always just add the LSB.
: $((perms*=2))
this_char=$(expr "$ls_out" : ".\{$i\}\(.\)")
# Lower case letters other than "l" indicate that permission bits are set.
# If it's not "r", "w", "x", or "-", it indicates that
case "$this_char" in
(l)
;;
([a-z])
: $((perms+=1))
esac
# If it's not "r", "w", "x", or "-", it indicates that
# one of the high-order (S/s=4000, S/s/L/l=2000, or T/t=1000) bits
# is set.
case "$this_char" in
([!rwx-])
: $((extra += 1 << (3-i/3) ))
esac
done
printf "%o%.3o\n" "$extra" "$perms"
done
टिप्पणियाँ:
उपयोग:
$ echo drwxr-xr-x | chmod-format
0755
$ echo -rwsr-sr-x | chmod-format
6755
$ echo -rwSr-Sr-- | chmod-format
6644
$ echo -rw-r-lr-- | chmod-format
2644
$ echo ---------- | chmod-format
0000
और, हां, मुझे पता है echo
कि पाठ के साथ उपयोग न करना बेहतर है जो इसके साथ शुरू हो सकता है -
; मैं सिर्फ प्रश्न से उपयोग उदाहरण की प्रतिलिपि बनाना चाहता था। ध्यान दें, जाहिर है, कि इस 0 चरित्र पर ध्यान नहीं देता (यानी, प्रमुख d
/ b
/ c
/ -
/ l
/ p
/ s
/ D
) और 10 वीं ( +
/ .
/ @
)। यह मानता है कि देखरेख ls
परिभाषित करेगा कभी नहीं
r
/ R
या w
/ W
तीसरे, छठे, या नौवें स्थिति में मान्य वर्ण के रूप में (और, अगर वे करते हैं, वे किया जाना चाहिए लाठियों से पीटा )।
इसके अलावा, मैं बस निम्नलिखित कोड पाया, कैस के तहत,
कैसे / समूह के तहत सभी फ़ाइलों के डिफ़ॉल्ट समूह / उपयोगकर्ता स्वामित्व को पुनर्स्थापित करने के लिए :
let perms=0
[[ "${string}" = ?r???????? ]] && perms=$(( perms + 400 ))
[[ "${string}" = ??w??????? ]] && perms=$(( perms + 200 ))
[[ "${string}" = ???x?????? ]] && perms=$(( perms + 100 ))
[[ "${string}" = ???s?????? ]] && perms=$(( perms + 4100 ))
[[ "${string}" = ???S?????? ]] && perms=$(( perms + 4000 ))
[[ "${string}" = ????r????? ]] && perms=$(( perms + 40 ))
[[ "${string}" = ?????w???? ]] && perms=$(( perms + 20 ))
[[ "${string}" = ??????x??? ]] && perms=$(( perms + 10 ))
[[ "${string}" = ??????s??? ]] && perms=$(( perms + 2010 ))
[[ "${string}" = ??????S??? ]] && perms=$(( perms + 2000 ))
[[ "${string}" = ???????r?? ]] && perms=$(( perms + 4 ))
[[ "${string}" = ????????w? ]] && perms=$(( perms + 2 ))
[[ "${string}" = ?????????x ]] && perms=$(( perms + 1 ))
[[ "${string}" = ?????????t ]] && perms=$(( perms + 1001 ))
[[ "${string}" = ?????????T ]] && perms=$(( perms + 1000 ))
मैंने इस कोड (लेकिन अच्छी तरह से नहीं) का परीक्षण किया है, और यह इस तथ्य को छोड़कर काम करने लगता है कि यह पहचान नहीं करता है l
या L
छठे स्थान पर है। ध्यान दें, हालांकि, जबकि यह उत्तर सादगी और स्पष्टता के मामले में बेहतर है, मेरा वास्तव में कम है ( लूप के अंदर केवल कोड की गिनती ; वह कोड जो एक -rwxrwxrwx
स्ट्रिंग को संभालता है , टिप्पणियों की गिनती नहीं), और इसे और भी छोटा बनाया जा सकता है। के
साथ बदलकर ।if condition; then …
condition && …
बेशक, आपको आउटपुट को पार्स नहीं करना चाहिएls
।
stat
। क्या आपके पास है? (यह एक GNU टूल है, इसलिए ज्यादातर लिनक्स पर उपलब्ध है, यूनिक्स पर नहीं।)