Ls -l আউটপুট ফর্ম্যাটটি chmod ফর্ম্যাটে রূপান্তর করুন


17

বলুন আমার থেকে নিম্নলিখিত ফলাফল রয়েছে ls -l:

drwxr-xr-x 2 root root 4096 Apr  7 17:21 foo

আমি কীভাবে এটির দ্বারা ব্যবহৃত বিন্যাসে স্বয়ংক্রিয়ভাবে রূপান্তর করতে পারি chmod?

উদাহরণ স্বরূপ:

$ echo drwxr-xr-x | chmod-format
755

আমি ওএস এক্স 10.8.3 ব্যবহার করছি।


2
সঙ্গে অনেক সহজ stat। তোমার কি আছে? (এটি একটি জিএনইউ সরঞ্জাম, তাই ইউনিক্সে নয়, লিনাক্সে বেশিরভাগ ক্ষেত্রে উপলভ্য))
manatwork

@ মান্যাট ওয়ার্ক stat fooদেয় 16777219 377266 drwxr-xr-x 119 Tyilo staff 0 4046 "Apr 7 17:49:03 2013" "Apr 7 18:08:31 2013" "Apr 7 18:08:31 2013" "Nov 25 17:13:52 2012" 4096 0 0 /Users/Tyilo। আমি 755এটি দেখতে পাচ্ছি না।
টাইলো

উত্তর:


24

কিছু সিস্টেমে কোনও ফাইলের অনুমতি সংখ্যা হিসাবে প্রদর্শিত করার জন্য কমান্ড রয়েছে, তবে দুর্ভাগ্যক্রমে, কিছুই বহনযোগ্য নয়।

zshমডিউলে একটি stat(ওরফে zstat) অন্তর্নির্মিত রয়েছে stat:

zmodload zsh/stat
stat -H s some-file

তারপর, modeহয় $s[mode]কিন্তু মোড, যে টাইপ + + perms হয়।

আপনি যদি অষ্টালটিতে প্রকাশিত অনুমতিগুলি চান তবে আপনার প্রয়োজন:

perms=$(([##8] s[mode] & 8#7777))

বিএসডি ( অ্যাপল ওএস / এক্স সহ ) এর একটি statকমান্ডও রয়েছে।

mode=$(stat -f %p some-file)
perm=$(printf %o "$((mode & 07777))"

জিএনইউ অনুসন্ধান (১৯৯০ এবং সম্ভবত এর আগে পর্যন্ত) অষ্টাল হিসাবে অনুমতিগুলি মুদ্রণ করতে পারে:

find some-file -prune -printf '%m\n'

পরবর্তীতে (2001, zsh stat(1997) এর অনেক পরে কিন্তু BSD stat(2002) এর আগে একটি জিএনইউ statকমান্ড চালু হয়েছিল আবার একটি আলাদা সিনট্যাক্স সহ:

stat -c %a some-file

এর অনেক আগে আইআরআইএক্সের ইতিমধ্যে একটি statকমান্ড ছিল (ইতিমধ্যে ১৯৯৪ সালে আইআরআইএক্স ৫.৩ রয়েছে) অন্য বাক্য গঠন সহ:

stat -qp some-file

আবার, যখন কোনও মানক কমান্ড নেই, বহনযোগ্যতার জন্য সেরা বেটটি হ'ল perl:

perl -e 'printf "%o\n", (stat shift)[2]&07777' some-file

15

বিকল্পটি statব্যবহার করে আপনি GNU কে অক্টাল ফরম্যাটে অনুমতিগুলি আউটপুট করতে বলতে পারেন -c। থেকে man stat:

       -c  --format=FORMAT
              use the specified FORMAT instead of the default; output a
              newline after each use of FORMAT
⋮
       %a     access rights in octal
⋮
       %n     file name

সুতরাং আপনার ক্ষেত্রে:

bash-4.2$ ls -l foo
-rw-r--r-- 1 manatwork manatwork 0 Apr  7 19:43 foo

bash-4.2$ stat -c '%a' foo
644

অথবা আপনি এটিকে statআউটপুটকে বৈধ কমান্ড হিসাবে ফর্ম্যাট করে স্বয়ংক্রিয় করতে পারেন :

bash-4.2$ stat -c "chmod %a '%n'" foo
chmod 644 'foo'

bash-4.2$ stat -c "chmod %a '%n'" foo > setpermission.sh

bash-4.2$ chmod a= foo

bash-4.2$ ls -l foo
---------- 1 manatwork manatwork 0 Apr  7 19:43 foo

bash-4.2$ sh setpermission.sh 

bash-4.2$ ls -l foo
-rw-r--r-- 1 manatwork manatwork 0 Apr  7 19:43 foo

উপরের সমাধানটি যদি ওয়াইল্ডকার্ড ব্যবহার করে তবে একাধিক ফাইলের জন্যও কাজ করবে:

stat -c "chmod -- %a '%n'" -- *

হোয়াইটস্পেস অক্ষরযুক্ত ফাইলের নামগুলির সাথে সঠিকভাবে কাজ করবে তবে একক উদ্ধৃতিযুক্ত ফাইলের নামগুলিতে ব্যর্থ হবে।


2
আমার statকাছে -cবিকল্প নেই। আমি ওএস এক্স 10.8.3 ব্যবহার করছি।
টাইলো

তথ্যের জন্য ধন্যবাদ, @ টাইলো। এবং দুঃখিত, আমি ওএস এক্স এর সরঞ্জামগুলির সাহায্য করতে পারি না।
manatwork

আউটপুট ফর্ম্যাট নির্দিষ্ট করার জন্য ম্যাক ওএস এক্স-এর পতাকা রয়েছে - ম্যাক ওএস এক্সstat -f 'chmod %p "%N"'
ম্যানপেজ

11

প্রতীকী থেকে অষ্টাল স্বরলিপি রূপান্তর করতে, আমি একবার এসেছিল :

chmod_format() {
  sed 's/.\(.........\).*/\1/
    h;y/rwsxtSTlL-/IIIIIOOOOO/;x;s/..\(.\)..\(.\)..\(.\)/|\1\2\3/
    y/sStTlLx-/IIIIIIOO/;G
    s/\n\(.*\)/\1;OOO0OOI1OIO2OII3IOO4IOI5IIO6III7/;:k
    s/|\(...\)\(.*;.*\1\(.\)\)/\3|\2/;tk
    s/^0*\(..*\)|.*/\1/;q'
}

সম্প্রসারিত:

#! /bin/sed -f
s/.\(.........\).*/\1/; # extract permissions and discard the rest

h; # store a copy on the hold space

# Now for the 3 lowest octal digits (rwx), translates the flags to
# binary where O means 0 and I means 1.
# l, L are for mandatory locking (a regular file that has 02000 on
# and not 010 on some systems like Linux). Some ls implementations
# like GNU ls confusingly use S there like for directories even though 
# it has nothing to do with setgid in that case. Some ls implementations 
# use L, some others l (against POSIX which requires an uppercase
# flag for extra flags when the execution bit is not set).
y/rwsxtSTlL-/IIIIIOOOOO/

x; # swap hold and pattern space, to do a second processing on those flags.

# now only consider the "xXlLsStT" bits:
s/..\(.\)..\(.\)..\(.\)/|\1\2\3/

y/sStTlLx-/IIIIIIOO/; # make up the 4th octal digit as binary like before

G; # append the hold space so we now have all 4 octal digits as binary

# remove the extra newline and append a translation table
s/\n\(.*\)/\1;OOO0OOI1OIO2OII3IOO4IOI5IIO6III7/

:k
  # translate the OOO -> 0 ... III -> 7 in a loop
  s/|\(...\)\(.*;.*\1\(.\)\)/\3|\2/
tk

# trim leading 0s and our translation table.
s/^0*\(..*\)|.*/\1/;q

ls -lএটি একটি ফাইলের আউটপুট থেকে অষ্টাল নম্বর প্রদান করে।

$ echo 'drwSr-sr-T' | chmod_format
7654

dpkgঅনুমতিগুলি "ইনস্টল করা হিসাবে" পুনরায় সেট করতে আমি আউটপুটে এটি ব্যবহার করেছি । কোন কমান্ড অনুমতি স্ট্রিং উত্পাদন করেছে তা বিবেচনা না করে আক্ষরিক প্রশ্নের উত্তর দেওয়ার জন্য আপনাকে ধন্যবাদ।
হাইটেকহিটচ

3

Sh এর অধীনে ম্যাকের উপর এই কমান্ড

stat -f "%Lp %N" your_files

আপনি যদি কেবলমাত্র সংখ্যার অনুমতি চান তবে কেবল% এলপি ব্যবহার করুন।

উদাহরণ স্বরূপ:

stat -f "%Lp %N" ~/Desktop
700 Desktop

700 হ'ল সংখ্যাসূচক অনুমতি যা chmod এ ব্যবহার করা যায় এবং ডেস্কটপ ফাইলের নাম।


2

এখানে প্রশ্নের উত্তর এর ওয়াই (উপেক্ষা প্রশ্ন এক্স ), অপ এর প্রচেষ্টা দ্বারা অনুপ্রাণিত:

#!/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

মন্তব্য:

  • LC_COLLATE=Cহওয়া ASCII অর্ডার ব্যবহার আচরণ চিঠি ক্রম পরিসীমা ধরনে শেল বলে, তাই [a-e]সমতূল্য [abcde]। কিছু লোকেলগুলিতে (যেমন, এন_ ইউএস) [a-e]সমান [aAbBcCdDeE] (যেমন, [abcdeABCDE]) বা সম্ভবত [abcdeABCD]- দেখুন বাশ মামলার বিবৃতি কেস-সংবেদনশীল নয় কেন ...? )
  • দ্বিতীয় সংস্করণে (POSIX- অনুগত একটি):

    • প্রথম caseবিবৃতি আবার লেখা যেতে পারে:

              case "$this_char" in
                ([a-km-z])
                      : $((perms+=1))
              esac
      

      তবে আমি মনে করি আমার এখন l যেভাবে রয়েছে তা হ'ল চিঠিটি অন্যরকমভাবে পরিচালিত হচ্ছে see বিকল্পভাবে, এটি আবার লেখা যেতে পারে:

              case "$this_char" in
                ([rwxst])
                      : $((perms+=1))
              esac
      

      যেহেতু r, w, x, s, এবং tশুধুমাত্র অক্ষর যে কখনও একটি মোড স্ট্রিং (ছাড়া অন্য প্রদর্শিত হওয়া উচিত হয় l)।

    • দ্বিতীয় caseবিবৃতি আবার লেখা যেতে পারে:

              case "$this_char" in
                ([rwx])
                      ;;
                ([A-Za-z])
                      : $((extra += 1 << (3-i/3) ))
               esac
      

      নিয়মটি প্রয়োগ করতে যে কেবলমাত্র অক্ষরগুলি মোড বিট নির্দিষ্ট করার জন্য বৈধ। (বিপরীতে, সম্পূর্ণ স্ক্রিপ্টে আরও সংক্ষিপ্ত সংস্করণটি অলস, এবং এর -rw@rw#rw%সমতুল্য হিসাবে  গ্রহণ করবে rwSrwSrwT)) বিকল্পভাবে, এটি আবার লেখা যেতে পারে:

              case "$this_char" in
                ([SsTtLl])
                      : $((extra += 1 << (3-i/3) ))
              esac
      

      যেহেতু S, s, T, t, L, এবং lশুধুমাত্র অক্ষর যে কখনও একটি মোড স্ট্রিং প্রদর্শিত হওয়া উচিত (ব্যতীত অন্য হয় r, wএবং x)।

ব্যবহার:

$ 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বৈধ অক্ষর হিসাবে সংজ্ঞায়িত করবেন না (এবং যদি তারা করেন তবে তাদের লাঠি দিয়ে প্রহার করা উচিত )।


এছাড়াও, আমি সবেমাত্র নীচের কোডটি পেয়েছি, ক্যাস দ্বারা , কীভাবে / var এর অধীনে সমস্ত ফাইলের ডিফল্ট গ্রুপ / ব্যবহারকারীর মালিকানা পুনরুদ্ধার করতে হবে :

        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


@ স্টাফেনচাজেলাস: ঠিক আছে, আমি বলেছিলাম #!/bin/shএবং তারপরে কয়েকটি বাশিজম ব্যবহার করেছি। উফ। তবে আপনি একটি দম্পতি মিস করেছেন: এবং এটি পসিক্স বলে মনে হয় না (স্ট্যান্ডার্ডটি মোটেই উল্লেখ করে না , এবং কাঠবিড়ালিভাবে এবং এটি )। বিপরীতে, আমি ব্যবহার করিনি ; এটি কেবল ক্যাসের উত্তরে প্রদর্শিত হবে , যা আমি এখান থেকে উদ্ধৃত করেছি । এছাড়াও, আমার উত্তরটি 'এল' এবং 'এল' পরিচালনা করে এবং আমি ইতিমধ্যে ক্যাসের উত্তরটি দেয় না এমন বিষয়টি উল্লেখ করেছি। $(( variable++ ))$(( number ** number ))**++-- [[…]]
স্কট

এল / এল সম্পর্কে দুঃখিত [[, আমি খুব দ্রুত পড়ি read হ্যাঁ, এবং ++ পসিক্স নয়। পসিক্স শেলগুলি এগুলিকে বাস্তবায়িত করার অনুমতি দেয়, এর অর্থ আপনি $((- -a))যদি দ্বিগুণ প্রত্যাখ্যান চান তবে আপনাকে লিখতে হবে, এটি নয় যে আপনি $((--a))হ্রাস অপারেশন বলতে ব্যবহার করতে পারেন ।
স্টাফেন চেজেলাস

নোট করুন যে seqকোনও পসিক্স কমান্ড নয়। Expr এড়ানোর জন্য আপনি $ {var #?} অপারেটরটি ব্যবহার করতে সক্ষম হতে পারেন। এটি নয় যে এলসি_সিএলএলসিটি এলসি_এলএলকে ওভাররাইড করবে না
স্টাফেন চাজেলাস

@ স্টাফেনচাজেলাস: ঠিক আছে, আপনি এখনই ক্যাসের উত্তর সম্পর্কে কথা বলছেন, তাই না? তিনি একটি অষ্টাল সংখ্যার মতো দেখতে একটি স্ট্রিং তৈরি করতে দশমিক গাণিতিক ব্যবহারের "অলস" পদ্ধতি গ্রহণ করছেন। দ্রষ্টব্য যে তার সমস্ত ধাপের মান (4000, 2000, 1000, 400, 200, 100, 40, 20, এবং 10) দশমিক সংখ্যা। তবে, যেহেতু কোনও 8's' বা 9'গুলি নেই 7এবং যে কোনও দশমিক অবস্থানের চেয়ে বেশি পাওয়ার কোনও উপায় নেই , তাই তিনি চরেড টানতে পারেন। ……… ...… ...… ... (এই মন্তব্যটি স্ট্যাটফিন চেজেলাসের মন্তব্যের প্রতিক্রিয়া যা অদৃশ্য হয়ে গেছে।)
স্কট

হ্যাঁ, আমি বুঝতে পেরেছিলাম এটি পরে, তাই আমি মন্তব্যটি মুছলাম।
স্টাফেন চেজেলাস

1

যদি আপনার লক্ষ্য যদি একটি ফাইলের কাছ থেকে অনুমতি নেওয়া হয় এবং সেটিকে অন্য একটিতেও দেওয়া হয় তবে জিএনইউ এর কাছে chmodইতিমধ্যে "রেফারেন্স" বিকল্প রয়েছে


ওপিতে উল্লেখ করা হয়েছিল যে তিনি অ্যাপল ওএস / এক্সে ছিলেন, সুতরাং সেখানে chmodজিএনইউ হবে না chmod
স্টাফেন চেজেলাস

আহ্ হ্যাঁ আমি অন্য উত্তরটিতে মন্তব্যটি দেখছি যেখানে তারা তাদের প্ল্যাটফর্মটি বলে। মাইন যদিও
জিএনইউর

0

একটি বিকল্প, যদি আপনি অনুমতিগুলি দূরে সরিয়ে রাখতে চান তবে সেগুলি পরে পুনরুদ্ধার করতে বা অন্য কোনও ফাইলে ব্যবহার করতে হয় setfacl/getfaclএবং এটি বোনাস হিসাবে (পসিএক্স-খসড়া) এসিএল পুনরুদ্ধার করবে।

getfacl some-file > saved-perms
setfacl -M saved-perms some-other-file

(সোলারিসের -fপরিবর্তে , ব্যবহার করুন -M)।

তবে কয়েকটি বিএসডি-তে উপলভ্য হলেও তারা অ্যাপল ওএস / এক্স-তে নেই যেখানে কেবল এসিএলগুলিই ম্যানিপুলেট করা হয় chmod


0

ম্যাক ওএস এক্সে (10.6.8) আপনাকে ব্যবহার করতে হবে stat -f format(কারণ এটি আসলে নেটবিএসডি / ফ্রিবিএসডি stat)।

# using Bash

mods="$(stat -f "%p" ~)"    # octal notation
mods="${mods: -4}"
echo "$mods"

mods="$(stat -f "%Sp" ~)"  # symbolic notation
mods="${mods: -9}"
echo "$mods"

ls -lকেবলমাত্র অষ্টাল দ্বারা উত্পাদিত একটি প্রতীকী অনুমতি স্ট্রিং অনুবাদ করতে (কেবল শেল বিল্টিন ব্যবহার করে) দেখুন: showperm.bash

# from: showperm.bash
# usage: showperm modestring
#
# example: showperm '-rwsr-x--x'
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.