হাজার হাজার ফাইলে chmod পুনরাবৃত্তির অনুমতি


16

এটি 'ছোমডিং' পুনরাবৃত্তির বিষয়ে আরও সাধারণ প্রশ্ন।

আমার কাছে এই স্ক্রিপ্টটি রয়েছে যা কয়েক মুহুর্তে ফোল্ডারে কয়েক'শ হাজার ফাইল থাকা অবস্থায় পুনরায় অনুমতিগুলি পরিবর্তন করতে হবে change সেই ফোল্ডারে প্রতিদিন নতুন নতুন ফাইল যুক্ত হয় তবে ইতিমধ্যে যে ফাইলগুলি রয়েছে সেগুলি ইতিমধ্যে সেট হয়ে গেছে এবং সেগুলি পরিবর্তন হয় না।

আমার প্রশ্ন ... আমি যখন ফোন করি

chmod 775। -R

ইতিমধ্যে সঠিক অনুমতি আছে এমন ফাইলগুলির জন্য বা কেবলমাত্র নতুন ফাইলগুলির জন্য যা সঠিক অনুমতি নেই সেগুলির জন্য অনুমতি সেট করার চেষ্টা করে?

স্ক্রিপ্টে এই কমান্ডটি অতিক্রম করতে সর্বদা যুগে যুগে সময় লাগে বলে মনে হয়, যদিও 'নতুন' ফাইলগুলি কয়েক হাজার এবং এটির অনুমতিগুলি তাদের দ্রুত করা উচিত।

আমি chmod এর জন্য ম্যান পেজটি দেখেছি, তবে এই ক্ষেত্রে এটির কোনও উল্লেখ করা বলে মনে হচ্ছে না।

যদি chmod এর আগে অনুমতিগুলির জন্য পরীক্ষা করে না, আমি কি 'chmod' এর সাথে 'ফাইন্ড' সংমিশ্রনের দিকে তাকানো শুরু করব?


3
আমি অবাক হয়েছি যে অনুমতিগুলি যাচাই করা এবং যদি তারা সঠিকভাবে সঠিক মান হিসাবে সেট করার চেয়ে সঠিক না হয় তবে এগুলি পরিবর্তন করা যদি সত্যিই ধীর হয়।
জর্জেট

1
যদি কেউ এতে হোঁচট খায় এবং + chmod কমান্ডটি সন্ধান করতে চান তবে এটি এখানে: অনুসন্ধান করুন। ! -পারম 775 -প্রিন্ট 0 | xargs -0 -I {mod chmod 775 {}
তিতি ডুমি

@ লার্জগেট, তাই আপনি বলছেন যে এটি খুঁজে পাওয়া ধীর? chmod? শুধু সব কিছু chmod চেয়ে। (দুঃখিত, আপনার মন্তব্য থেকে বুঝতে পারিনি)। চিয়ার্স
টিটি ডুমি

আমার নম্র মতে এটি দু'টি প্রক্রিয়া শুরু করতে এবং প্রথমটির আউটপুটটিকে দ্বিতীয়টিতে পুনর্নির্দেশ করতে হবে বলে এটি সম্ভবত ধীর। অনুমতি নির্ধারণের জন্য যে সময় লাগে তা তার উপর নির্ভর করে যা ইনোডে সংশোধন করার জন্য মাত্র 3 বাইট হওয়ায় এটি গুরুত্বপূর্ণ নাও হতে পারে।
get

1
@depquid এখানে প্রধান কার্য সম্পাদনের সমস্যাটি হ'ল ডিস্ক ক্যাশে ডেটা পড়ছে। প্রথম রান করার পরে সমস্ত কিছু ডিস্কের ক্যাশে রয়েছে (যদি না খুব কম স্মৃতি থাকে) তবে আপনি এমন কোনওটির পারফরম্যান্স পরীক্ষা করছেন যা বাস্তব পরিস্থিতিতে বাধা নয়।
হউক লেগেইন

উত্তর:


9

chmodআপনার ইচ্ছামত ইতিমধ্যে সেট করা ফাইলগুলির অনুমতিগুলি পরিবর্তন করতে পারে বা নাও পারে, তবে তা না পারলে তাদের বর্তমান অনুমতিগুলি কি রয়েছে তা দেখার জন্য তাদের এখনও পরীক্ষা করা প্রয়োজন [0]। কয়েক হাজার ফাইল সহ, আমি মনে করি না এটি কোনওভাবেই গুরুত্বপূর্ণ হবে; সময়টি সম্ভবত statপ্রতিটি ফাইল আইএনপি দ্বারা ব্যয় করা হয় ।

আপনি findসর্বশেষ রানের চেয়ে নতুন ফাইলগুলি চালনা করার জন্য যা ফাইল চালানোর প্রয়োজন তা পরীক্ষা করে দেখতে চেষ্টা করতে পারেন chmod, তবে আপনি খুব দ্রুত গতিতে উন্নতি পাবেন বলে আমি মনে করি না।

আপনার স্ক্রিপ্টের জন্য যদি সম্ভব হয় তবে নতুন ফাইলগুলি "হোল্ডিং" ক্ষেত্র হিসাবে প্রথমে আলাদা ডিরেক্টরিতে রাখতে সক্ষম হতে পারেন। তারপরে আপনি chmodসেই ডিরেক্টরিটি (যাতে কেবল নতুন ফাইল রয়েছে), এবং mvবাকীগুলির সাথে সেগুলি করতে পারেন। এটি যথেষ্ট পরিমাণে দ্রুত হওয়া উচিত, তবে দুর্ভাগ্যক্রমে প্রতিটি অ্যাপ্লিকেশনের জন্য কাজ করবে না।

[0] এমনকি যদি এটি ফাইলগুলির অনুমতি নির্ধারণের চেষ্টা করে যা কোনও পরিবর্তনের প্রয়োজন হয় না, অন্তর্নিহিত ফাইল সিস্টেম সম্ভবত অনুরোধটি দিয়ে কিছুই করবে না কারণ এটি অপ্রয়োজনীয়।


তার জন্য ধন্যবাদ. আমি চেষ্টা করব | chmod সংস্করণ এবং দেখুন এটি জিনিসগুলিকে দ্রুত করে তোলে কিনা। যদি না হয় তবে আপনার পরামর্শ অনুসারে আমি 'হোল্ডিং' ফোল্ডারটি প্রয়োগ করতে স্ক্রিপ্টটি পরিবর্তন করার চেষ্টা করব।
টিটি ডুমি

আপনি গতির উন্নতি না করার কারণটি হ'ল সিডটাইম এবং অ্যাক্সেস রাইটস উভয়ের জন্যই ইনোডটি পড়তে হবে।
হউক লেগেইন

10

অনুসন্ধান / chmod অপ্টিমাইজেশন

উভয় findএবং chmodপড়া আছে

  1. সমস্ত ডিরেক্টরি এন্ট্রি
  2. এই সমস্ত এন্ট্রি জন্য inodes

আপনি প্রথমে সমস্ত এন্ট্রি এবং তারপরে সমস্ত ইনোডগুলি (একটি ঘোরানো ডিস্কে) পড়ে একটি পারফরম্যান্স উন্নতি পেয়েছেন কারণ ডিস্কের মাথাটি ডিরেক্টরি এবং ইনোডগুলির মধ্যে নড়ে না। হিসাবে chmod হয় মূঢ় (অন্যান্য উত্তর এক ব্যাখ্যা) এটা মাধ্যমে বলা উচিত findশুধুমাত্র। তবে তবুও এটি প্রথম লিখিত হওয়ার আগে সমস্ত ইনোডগুলি পড়তে সহায়তা করতে পারে (ধরে নিই যে ডিস্ক ক্যাশে আপনার জন্য পর্যাপ্ত ফ্রি র্যাম রয়েছে)। আমি এটি প্রস্তাব:

find . -printf "" # reading the file names only
find . ! -perm 775 -printf "" # reading all the inodes (file names are cached)
find . ! -perm 775 -exec chmod 775 + # writing to the cache without reading from disk

ভাল সমাধান: এসিএল

ভাল সমাধানটি সম্পূর্ণ আলাদা হতে পারে: যদি এই ডিরেক্টরিতে ফাইলগুলি তৈরি করা হয় (এবং অন্য কোথাও থেকে সরানো হয়নি) তবে এসিএলগুলি ফ্লাইতে কাজটি করতে পারে। আপনাকে কেবল প্যারেন্ট ডিরেক্টরিতে ডিফল্ট এসিএল সেট করতে হবে।

ফাইল সিস্টেমের অপ্টিমাইজেশন দ্বারা আরও উন্নতি পৌঁছে যেতে পারে। এটি যদি ext3 / ext4 হয় তবে আপনি e2fsck -Dসময়ে সময়ে চালাতে পারেন । হয়তো এটি এই ডিরেক্টরিটিকে একটি পৃথক ভলিউমের উপর রাখতে সহায়তা করে। আপনি বিভিন্ন ফাইল সিস্টেম বা ফাইল সিস্টেম সেটিংস চেষ্টা করতে পারেন (যেমন বিভিন্ন ইনোড আকার)।


এসিএলগুলি যতক্ষণ না আপনি এনএফএসভি 4 মাউন্টে কাজ করছেন না ততক্ষণ ভাল।
ostrokach

findআমার chmodডকারের ধারকটির ভিতরে থাকা সমাধানটি আমার সময় দ্বিগুণ করে ।
নাথান রিইনস্টেটমোনিকা আর্থার

8

ব্যবহারের ধরে নেওয়া যাক chmodথেকে গনুহ coreutils প্যাকেজ উবুন্টু 12.10 তে।

chmod 775 . -Rfchmodatঅনুমতিগুলির পরিবর্তন হওয়া দরকার কিনা তা নির্বিশেষে প্রতিটি ফাইলের জন্য সিস্টেম কল কার্যকর করে । আমি কোডটি পরীক্ষা করে এবং strace chmod 775 . -R(নীচের স্নিপেট) ব্যবহার করে উভয় দ্বারা এটি নিশ্চিত করেছিলাম আসল আচরণের তালিকা তৈরি করতে।

newfstatat(4, "d", {st_mode=S_IFREG|0666, st_size=0, ...}, AT_SYMLINK_NOFOLLOW) = 0
fchmodat(4, "d", 0775)                  = 0
newfstatat(4, "c", {st_mode=S_IFREG|0666, st_size=0, ...}, AT_SYMLINK_NOFOLLOW) = 0
fchmodat(4, "c", 0775)                  = 0
newfstatat(4, "a", {st_mode=S_IFREG|0666, st_size=0, ...}, AT_SYMLINK_NOFOLLOW) = 0
fchmodat(4, "a", 0775)                  = 0
newfstatat(4, "b", {st_mode=S_IFREG|0666, st_size=0, ...}, AT_SYMLINK_NOFOLLOW) = 0
fchmodat(4, "b", 0775)                  = 0

fchmodatপ্রতিটি ফাইলে চলার কয়েকটি অসুবিধা রয়েছে

  • বিপুল সংখ্যক ফাইল পরিবর্তন করা গেলে অতিরিক্ত সিস্টেম কল সম্ভবত তাৎপর্যপূর্ণ হয়ে উঠবে। find/ xargs/ chmodপদ্ধতি অন্যদের দ্বারা উল্লিখিত সম্ভবত শুধু তাই পরিবর্তন প্রয়োজন ফাইল পরিবর্তন করে দ্রুততর হবে।
  • fchmodatপ্রতিটি ফাইলের ফাইলের স্থিতি পরিবর্তন (সিটিটাইম) পরিবর্তন করার কল । এটি প্রতিটি ফাইল / ইনোড প্রতিবার পরিবর্তিত করবে এবং অতিরিক্ত ডিস্ক লেখার কারণ হতে পারে। এই অতিরিক্ত লেখাগুলি বন্ধ করতে মাউন্ট বিকল্পগুলি ব্যবহার করা সম্ভব হতে পারে।

একটি সহজ পরীক্ষা সিটিটাইমের পরিবর্তনগুলি সোজা হয়ে যাওয়া দেখায় chmod

auser@duncow:/tmp/blah.test$ ls -lc
total 0
-rwxrwxr-x 1 laptop laptop 0 Jun 18 18:17 a
-rwxrwxr-x 1 laptop laptop 0 Jun 18 18:17 b
-rwxrwxr-x 1 laptop laptop 0 Jun 18 18:17 c
-rwxrwxr-x 1 laptop laptop 0 Jun 18 18:17 d
auser@duncow:/tmp/blah.test$ chmod 775 . -R
auser@duncow:/tmp/blah.test$ ls -lc
total 0
-rwxrwxr-x 1 laptop laptop 0 Jun 18 18:25 a
-rwxrwxr-x 1 laptop laptop 0 Jun 18 18:25 b
-rwxrwxr-x 1 laptop laptop 0 Jun 18 18:25 c
-rwxrwxr-x 1 laptop laptop 0 Jun 18 18:25 d

তবে কয়েক মিনিট পরে find/ xargs/ এ পরিবর্তন হয় নাchmod

auser@duncow:/tmp/blah.test$ date
Tue Jun 18 18:27:27 BST 2013
auser@duncow:/tmp/blah.test$ find . ! -perm 775 -print0 | xargs -0 -I {} chmod 775 {}
auser@duncow:/tmp/blah.test$ ls -lc
total 0
-rwxrwxr-x 1 laptop laptop 0 Jun 18 18:25 a
-rwxrwxr-x 1 laptop laptop 0 Jun 18 18:25 b
-rwxrwxr-x 1 laptop laptop 0 Jun 18 18:25 c
-rwxrwxr-x 1 laptop laptop 0 Jun 18 18:25 d

আমি সর্বদা find/ xargs/ chmodসংস্করণটি ব্যবহার করার প্রবণতা রাখি কারণ অনুসন্ধানগুলি জিনিসগুলি নির্বাচন করার ক্ষেত্রে আরও নিয়ন্ত্রণ দেয়।


1

[উত্স] (1) দেখায়, যা chmod(1)সর্বদা মোড সেট করার চেষ্টা করে এবং [fstatat (2)] (2) দিয়ে আবার চেক করে।

ফাইলগুলি [fts (3)] (3) এর মাধ্যমে প্রক্রিয়াজাত করা হয়, যা ডেটা ট্রি তৈরির জন্য সমস্ত ট্র্যাভারযুক্ত ফাইল সিস্টেমের অবজেক্টগুলিকে 'স্থিতি' করতে হয়।

ইউনিক্সলোর একটি [সুন্দর নিবন্ধ] (4) বৈশিষ্ট্যযুক্ত যেখানে chmod(1)একটি find/ xargsপদ্ধতির বিরুদ্ধে সময় নির্ধারিত হয়: পরবর্তীকালের বিশালতা দ্বারা জয়ী হয়।

কমান্ড লাইনটি মূল প্রশ্নের সাথে মানিয়ে নিয়েছে:

find . -print0 | xargs -0 chmod 775

দুটি কারণ:

  1. ফাইল প্রক্রিয়া ট্র্যাভারসাল দুটি প্রক্রিয়াগুলির মধ্যে পাইপের মাধ্যমে ফাইলগুলির অপারেশন থেকে ডিউপলড হয়, যা এমনকি বিভিন্ন কোরেও চলতে পারে।

    1. fts(3)অপারেশন হ্রাস করা হয়, কারণ xargs(1)ডিরেক্টরি ট্রি 'সমতল'।

তাই হ্যাঁ: আপনি স্পষ্টভাবে ব্যবহার করা উচিত find/ xargs। একটি সহজ সমাধান জন্য।

অন্যান্য অপশন:

  • [Umask] (5) এবং প্রক্রিয়াটির সোর্স কোড (এস) দিয়ে নতুন ফাইলগুলি লিখুন Play

  • আপনি যদি লিনাক্স ব্যবহার করে থাকেন তবে আপনার সিস্টেমটি inotifyকার্নেল সাব- সিস্টেমটি সক্ষম করেছে । এই ক্ষেত্রে, আপনি [ইনোটিফাইয়েট (1)] (6) এর মাধ্যমে একটি কার্যকর সমাধানের স্ক্রিপ্ট করতে পারেন।


সিডিনোট: আপনি যদি আপনার ফাইলগুলিতে অনুমতিগুলি সম্পাদন না করতে চান তবে আমি অনুরোধটি তেমনটি পরিবর্তন করার পরামর্শ দিই:

find . -type f -print0 | xargs -0 chmod 664
find . -type d -print0 | xargs -0 chmod 775

সম্পাদকদের কাছে নোট: আমাকে পোস্টে আরও দুটি লিঙ্ক যুক্ত করার অনুমতি নেই, না অন্য পোস্টে মন্তব্য করার জন্য। আমি ইউআরএলগুলি এখানে রেখেছি এবং আশা করি যথেষ্ট খ্যাতি সম্পন্ন কিছু মুক্তমনা ব্যবহারকারী তাদের পাঠ্যে ফিরিয়ে রাখবেন এবং এই অনুচ্ছেদটিকে মুছে ফেলবেন।


এর সাথে ডিস্ক ক্যাশে প্রাইমিংয়ের বিষয়ে মন্তব্য করুন find . -printf "":

এটি নিম্নলিখিত chmodক্রিয়াকলাপগুলি কার্যকর করতে গতি পেতে পারে , তবে উপলব্ধ মেমরি এবং i / o লোডের উপর নির্ভর করে। সুতরাং এটি কাজ করতে পারে, না। ট্র্যাভারসাল ( find) এবং chmodঅপারেশনটিকে ইতিমধ্যে ক্যাচিংয়ের ব্যবস্থা করে, তাই ক্যাশে প্রাইমিং অতিমাত্রায় হতে পারে।

  1. HTTPS + + lingrok.org / xref / coreutils / src / chmod.c # process_file
  2. HTTPS + + linux.die.net / মানব / 2 / fstatat
  3. HTTPS + + linux.die.net / মানব / 3 / FTS
  4. HTTP + + www.unixlore.net / নিবন্ধ / দ্রুত গাড়ী চালানোর আপ-বাল্ক-ফাইল-operations.html
  5. HTTPS + + en.wikipedia.org / উইকি / Umask
  6. HTTPS + + linux.die.net / মানব / 1 / inotifywait

0

আপনি কি 0775 মোড দিয়ে ফাইলটি তৈরি করার প্রক্রিয়া (এস) পরিবর্তন করার বিষয়টি বিবেচনা করেছেন? পরিবেশে উমাস্কের মানটি দেখুন - 0002 সাহায্য করতে পারে।

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.