প্রশ্ন কমান্ড লাইন থেকে কিভাবে আমি octal ফাইল অনুমতি পেতে পারি?


সেখানে একটি chmod ফাইল অনুমতি সেট করার জন্য কমান্ড, কিন্তু আমি কমান্ড লাইন থেকে অক্টাল মোডে (যেমন 755) ফাইল অনুমতি পেতে পারি?


316
2018-06-17 08:04


উত্স




উত্তর:


আপনি চেষ্টা করতে পারেন

stat -c "%a %n" *

প্রতিস্থাপন করা * প্রাসঙ্গিক ডিরেক্টরি বা সঠিক ফাইলের নাম যা আপনি পরীক্ষা করতে চান।

থেকে মান পৃষ্ঠা পাতা,

-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

ব্যবহার:

  • ফাইলের সাথে:

    $ stat -c "%a %n" ./Documents/Udev.html 
    664 ./Documents/Udev.html
    
  • ফোল্ডার দিয়ে:

    $ stat -c "%a %n" ./Documents/
    755 ./Documents/
    

(রেফারেন্স)


450
2018-06-17 08:08



ম্যাক ওএস ব্যবহার করুন stat -f '%A %a %N' * (ক্রেডিট: geeklog.adamwilson.info/article/58/...) - s2t2
আপনি যদি আরো আরামদায়ক হয় ls: for f in $(ls -a); do stat -c "%a %n" $f; done; - usandfriends
@usandfriends আউটপুট looping ls একটি খারাপ ধারণা। আপনি সত্যিই একটি লুপ ব্যবহার করতে চান, তাহলে আপনি করতে পারেন for f in *; do stat "%a %n" "$f"; done - Tom Fenech
কেন ম্যাক os উপর সবকিছু সামান্য পরিবর্তিত হয় (এমনকি ইউনিক্স Iso utils)? এই একটি প্রকৃত কারণ আছে? - Vassilis
@ হ্যাকেল, অনুগ্রহ করে বলুন কিভাবে আপনি সত্যিই অনুভব করেন। হাঃ হাঃ হাঃ! - MikeSchinkel


লিনাক্সে ফাইলের অনুমতিগুলি লিনাক্স স্ট্যাট কমান্ড ব্যবহার করে অক্টাল ফর্ম্যাটে প্রদর্শিত হতে পারে।

শুধু প্রেস জন্য ctrl+ +অল্টার+ +টি টার্মিনাল খুলতে আপনার কীবোর্ডে। এটি খোলার সময়, ডিরেক্টরির মধ্যে নেভিগেট করুন যেখানে আপনি octal মোডে ফাইলের অনুমতিগুলি খুঁজতে চান।

stat -c '%A %a %n' *

% একটি মানুষের পঠনযোগ্য ফর্ম অ্যাক্সেস অধিকার

% octal অ্যাক্সেস অধিকার

% n ফাইলের নাম

অকটাল সংখ্যা এবং অনুমতি

আপনি মোড / অনুমতি প্রতিনিধিত্ব করতে octal নম্বর ব্যবহার করতে পারেন:

r: 4
w: 2
x: 1

উদাহরণস্বরূপ, ফাইলের মালিকের জন্য আপনি নিম্নরূপ অকটাল মোড ব্যবহার করতে পারেন। পড়ুন,   অক্টাল্টে একটি ফাইলের উপর লিখুন এবং পূর্ণ (পূর্ণ) অনুমতি 0 + r + w + x =   0 + 4 + 2 + 1 = 7

অক্টালের একটি ফাইলের উপর শুধুমাত্র পড়ার অনুমতি লিখুন 0 + r + w + x = 0 + 4 + 2 + 0   = 6

শুধুমাত্র octal মধ্যে একটি ফাইলের অনুমতি এবং পড়ার অনুমতি 0 + r + w + x =   0 + 4 + 0 + 1 = 5

গ্রুপ এবং অন্যদের জন্য অনুমতি গণনা করার পদ্ধতি উপরে ব্যবহার করুন। চল আমরা   আপনি মালিক, পড়া এবং নির্বাহ করতে পূর্ণ অনুমতি দিতে ইচ্ছুক বলুন   গ্রুপের অনুমতি, এবং অন্যদের শুধুমাত্র অনুমতি পড়তে, তারপর আপনি প্রয়োজন   নিম্নরূপ অনুমতি গণনা করার জন্য: ব্যবহারকারী = r + w + x = 0 + 4 + 2 + 1 = 7 গোষ্ঠী =   r + w + x = 0 + 4 + 2 + 0 = 6 অন্য = r + w + x = 0 + 0 + 0 + 1 = 1

কার্যকর অনুমতি 761।

উৎস: http://kmaiti.blogspot.com/2011/09/umask-concept.html


37
2018-06-17 08:14



প্রাথমিক 0 খুব বিশেষ বিট প্রতিনিধিত্ব করে: pastebin.com/6ymkFt71 - Braiam


হিসাবে বিস্তারিত "755" -স্টাইল অনুমতি দিয়ে 'ls' দ্বারা আদম আদালত উপর AgileAdam.com, আপনি তৈরি করতে পারেন একটি উপনাম  lso যে মত কাজ করে ls -l কিন্তু সামান্য আউটপুট প্রসেস1 octal মধ্যে অনুমতি প্রদর্শন করতে। এই তিন অঙ্ক দেখাচ্ছে একটি নেতৃস্থানীয় কলাম যোগ করে2 octal অনুমতি। লিখিত হিসাবে, এটি বেশিরভাগ ফাইল এবং ডিরেক্টরিগুলির জন্য কাজ করে তবে এটি সঠিকভাবে কাজ করে না আঠাল অথবা setuid / setgid বিট সেট করা হয়।3

alias lso="ls -alG | awk '{k=0;for(i=0;i<=8;i++)k+=((substr(\$1,i+2,1)~/[rwx]/)*2^(8-i));if(k)printf(\" %0o \",k);print}'"

এই একটি গুরুতর অভাব আছে, যদিও, হিসাবে techtonik  পয়েন্ট আউট। আপনি আর্গুমেন্ট পাস করতে পারবেন না এই lso উদীয়মান হিসাবে আপনি করতে হবে দ্য ls হুকুম, কারণ তারা অতিরিক্ত আর্গুমেন্ট হিসাবে নেওয়া হয় awk পরিবর্তে. সুতরাং আপনি চালানো যাবে না lso একটি নির্দিষ্ট ফাইল বা ডিরেক্টরি উপর, অথবা আপনি কোন বিকল্প (যেমন -F, অথবা --color) থেকে lso


সংশোধন সংজ্ঞায়িত করা হয় lso  হিসেবে ক্রিয়া বরং একটি উপনাম চেয়ে।

lso() { ls -alG "$@" | awk '{k=0;for(i=0;i<=8;i++)k+=((substr($1,i+2,1)~/[rwx]/)*2^(8-i));if(k)printf(" %0o ",k);print}'; }

আপনি যদি আপনার শেল এ ইন্টারঅ্যাক্টিভভাবে এটি চেষ্টা করে থাকেন, চালান unalias lso উপনাম মুছে ফেলার জন্য - আপনি ফাংশন সংজ্ঞায়িত করার আগে অথবা পরে এটি করতে পারেন। যদি আপনি এটি এমন একটি ফাইলে রাখেন যা সোর্স করা হয়, যেমন ~/.bashrc, শুধু নিতে alias লাইন এবং ফাংশন সংজ্ঞা যোগ করুন।

কেন এই কাজ করে? Aliases বিপরীত, বাশ শেল ফাংশন অবস্থানগত পরামিতি নিতে পারেন, যেমন, কমান্ড লাইন আর্গুমেন্ট"$@" পূর্ণ যুক্তি তালিকা প্রসারিত, যুক্তি আর্গুমেন্ট lso ফাংশন পাস করা হবে ls। (একটি উদীয়মান সংজ্ঞা থেকে ভিন্ন, একটি ফাংশন শরীরের উদ্ধৃত করা হয় না, তাই এটি অপসারণ করা প্রয়োজন ছিল \আগে অক্ষর $ এবং "।)

যেহেতু আপনি অপশন পাস করতে পারেন lso ফাংশন হিসাবে এই ভাবে সংজ্ঞায়িত করা হলে, আপনি অপসারণ করতে পারেন -a এবং -G সংজ্ঞা থেকে অপশন - আপনি যেখানে তাদের চান ক্ষেত্রে আপনি নিজে পাস করতে পারেন। (দ্য -l ফাইলের অনুমতিগুলি দেখানোর মতো বিকল্পের জন্য বিকল্পটি প্রয়োজন সব সময়ে, তাই এটি অপসারণ করার কোন সুবিধা নেই।)

lso() { ls -l "$@" | awk '{k=0;for(i=0;i<=8;i++)k+=((substr($1,i+2,1)~/[rwx]/)*2^(8-i));if(k)printf(" %0o ",k);print}'; }

ধন্যবাদ techtonik জন্য সীমাবদ্ধতা নির্দেশ আউট সংজ্ঞায়িত lso একটি উপনাম হিসাবে, এইভাবে পরিবর্তে এটি একটি ফাংশন তৈরীর সম্পর্কে উপাদান সঙ্গে এই পোস্ট প্রসারিত আমাকে প্রেরণা।


1এক এই flout মনে মনে হতে পারে আউটপুট পার্সিং সম্পর্কে সাধারণ নিয়ম lsls খুব মানব পঠনযোগ্য আউটপুট উত্পাদন করে; এই idiosyncrasies এবং সীমাবদ্ধতা প্রবর্তন এটি সাধারণত অন্যান্য কমান্ডের জন্য ইনপুট হিসাবে অনুপযুক্ত। এক্ষেত্রে আমরা পার্স ls থেকে আমরা সঠিক আচরণ সংরক্ষণ করতে ইচ্ছুক ls আমাদের ছাড়া এক যোগ পরিবর্তন।

2এই উপনামগুলির একটি সীমাবদ্ধতা, যা এটি নীচে প্রদর্শিত ফাংশন সংস্করণে প্রযোজ্য, এবং যা একটি বাগ হিসাবে বিবেচিত হতে পারে, এটি শুধুমাত্র তিনটি অষ্টমিক সংখ্যা প্রদর্শন করে এমনকি চতুর্থ অষ্টম সংখ্যা শূন্য হয়। যেমন jfmercer হয়েছে সঠিকভাবে নির্দেশিত, এখানে প্রদর্শিত octal সংখ্যা উপস্থিত থাকলে স্টিকি বিট প্রতিফলিত না, না setuid বা setgid বিট।

3চতুর্থ octal অঙ্ক দেখাচ্ছে না চেয়ে আরো গুরুত্ব সহকারে এই পদ্ধতি অনুমান তারা সেট করা হয় না, এবং যদি তারা হয় - যদি আপনি দেখতে t, s, অথবা S অনুমতি স্ট্রিং - তারপর আপনি অক্টাল সংখ্যা উপেক্ষা করা উচিত। এই কারণে বিটগুলি এমনভাবে অনুমোদিত স্ট্রিং থেকে অনুমিত হয় যা স্টিকি সেটুড / সেটগিড বিটগুলির জন্য অ্যাকাউন্ট করে না।


33
2018-06-17 08:12



ডিরেক্টরি সঙ্গে কাজ করে না - awk: read error (Is a directory) - anatoly techtonik
@ টেকটনিক এই নির্দেশের জন্য ধন্যবাদ! আমি (অবশেষে) এর জন্য একটি ফিক্স অন্তর্ভুক্ত করার জন্য এই উত্তরটি আপডেট করেছি। - Eliah Kagan
আপনি যোগ করতে পারেন --color শো রং জন্য পরামিতি lso() { ls -alG "$@" --color | awk '{k=0;for(i=0;i<=8;i++)k+=((substr($1,i+2,1)~/[rwx]/)*2^(8-i));if(k)printf(" %0o ",k);print}'; } - tagplus5


শুধু পূর্ববর্তী 'স্ট্যাট' সম্পর্কিত উত্তরগুলি সরানো হচ্ছে:

আপনি সহজেই চালাতে পারেন:

stat <path_to_file>

আউটপুট অন্যান্য তথ্য বরাবর octal অনুমতি থাকবে।



বিবরণ (স্ট্যাট সংস্করণ এবং উদাহরণ):

# stat --version
stat (GNU coreutils) 8.4


[user@localhost ~]# touch /tmp/TEST_PERMISSONS

[user@localhost ~]# chmod 644 /tmp/TEST_PERMISSONS

[user@localhost ~]# stat /tmp/TEST_PERMISSONS
  File: `/tmp/TEST_PERMISSONS'
  Size: 0           Blocks: 0          IO Block: 4096   regular empty file
Device: fd00h/64768d    Inode: 1010058     Links: 1
Access: (0644/-rw-r--r--)  Uid: (    0/    root)   Gid: (    0/    root)
Access: 2015-08-26 18:58:59.000000000 +0300
Modify: 2015-08-26 18:58:59.000000000 +0300
Change: 2015-08-26 18:59:16.000000000 +0300

উল্লেখ্য: (0644/ -rw-R - r--)


17
2017-08-26 16:07





পোর্টেবিলিটি জন্য, আপনি ব্যবহার করতে পারেন perl:

$ perl -e 'printf "%04o %s\n", (stat)[2] & 07777, $_ for @ARGV' *.txt
0644 1.txt
0644 2.txt
0644 3.txt
0644 4.txt
0600 PerlOneLiner.txt
0664 perl.txt

কোন ত্রুটি ঘটে যখন আপনি লক্ষ্য করতে চান, চেষ্টা করুন:

perl -e '
for (@ARGV) {
    print "$!: $_\n" and next unless -e;
    printf "%03o %s\n", (stat)[2] & 07777, $_;
}
' *.txt

6
2017-09-21 15:30



পোর্টেবল হওয়ার পাশাপাশি, @ কুওংলম এর সমাধান দেখায় চার বরং octal অক্ষর তিন, এইভাবে "স্টিকি বিট" অবস্থা দেখাচ্ছে যা প্রায়শই ভুলে যায়। - jfmercer


তুমি ব্যবহার করতে পার find সঙ্গে -printf কর্ম.

ls octal অনুমতি প্রদর্শন না, কিন্তু আপনি এই ব্যবহার করতে পারেন findভিত্তিক কাজকর্ম:

find পথ -printf "%m:%f\n"

উদাহরণস্বরূপ, আমার ভিডিও ডিরেক্টরি চেক করার জন্য:

$ find Videos -printf "%m:%f\n"
755:Videos

দ্য %m বিন্যাস স্পেসিফিকেশন বলে -printf কার্যকালীন অনুমতি মুদ্রণ করার সময়, যখন %f বিন্যাস স্পেসিফিকেশন এটি ফাইল নাম মুদ্রণ কারণ।

আপনি একাধিক ফাইলের নাম পাস করতে পারেন find। আপনি এমনকি globs ব্যবহার করতে পারেন (উদাঃ, find * -printf "%m:%f\n")।

আপনি যেমন একটি পরীক্ষা ব্যবহার করতে হবে না -name অথবা -iname; পয়েন্টগুলি শুরু করার জন্য আপনি আগ্রহী এমন ফাইল বা ডিরেক্টরিগুলির নাম পাস করতে যথেষ্ট find। যে, শব্দ পরে অবিলম্বে তাদের নাম সরবরাহ হিসাবে find, উপরে প্রদর্শিতভাবে.

find এটি আউটপুট দেখায় কিভাবে আপনি মহান নিয়ন্ত্রণ দেয়। বিশেষভাবে দুটি পরিবর্তন রয়েছে যা আপনাকে দরকারী হতে পারে:

  • গতানুগতিক, find অনুরূপ subdirectories, recurses ls -R। যদি আপনি চান না find আপনি যে প্রারম্ভিক পয়েন্টগুলিতে এটি পাস করেছেন তার সাবডিরেক্টরিগুলিতে যান, আপনি যোগ করতে পারেন -maxdepth 0 (অথবা ব্যবহার -maxdepth অন্যান্য মানগুলির সাথে আপনি কত গভীর এটি যেতে চান তা নির্দেশ করে)।

    $ find Documents -maxdepth 0 -printf "%m:%f\n"
    755:Documents
    
  • %f শুধুমাত্র একটি ফাইলের নাম দেখায়, তাই যদি find একটি ফাইল পেতে recurse আছে, আপনি এটি অবস্থিত যেখানে জানতে পারে না। কোনও পথ দেখানোর জন্য, যে কোনও শুরুতে ফাইলটি পাওয়া যায় তার সাথে শুরু করে, ব্যবহার করুন %p পরিবর্তে.

    $ find /boot -printf "%m:%p\n"
    755:/boot
    644:/boot/initrd.img-4.4.0-92-generic
    600:/boot/System.map-4.4.0-93-generic
    600:/boot/vmlinuz-4.4.0-92-generic
    600:/boot/vmlinuz-4.4.0-93-generic
    ....

দেখ man find ব্যবহার সম্পর্কে আরও তথ্যের জন্য find কমান্ড।

আরেকটি পদ্ধতি (ls এবং awk)

এটি তাদের অনুমতিগুলির সাথে সমস্ত ডিরেক্টরি ফাইল তালিকাবদ্ধ করতে ব্যবহার করা যেতে পারে:

ls -l | awk '{k=0;for(i=0;i<=8;i++)k+=((substr($1,i+2,1)~/[rwx]/) \
             *2^(8-i));if(k)printf("%0o ",k);print}'

এটি মূলত একই কমান্ড আদম কোর্টেম্যান্স এর lso উপনাম, যা যে উত্তর উদ্ধৃত, শুধু একটি কমান্ড হিসাবে চালানো। আপনি যদি শুধুমাত্র একবার বা বিরল উপলক্ষ্যে এটি ব্যবহার করেন তবে আপনি হয়তো ওরফে বা শেল ফাংশন হিসাবে এটি লিখতে বিরক্ত করতে পারেন না।


2
2018-03-07 07:16