ফাইলগুলি বাদে কীভাবে পুনরুক্তরূপে সমস্ত ডিরেক্টরি chmod করবেন?


573

কীভাবে সমস্ত ডিরেক্টরিতে 755 টি chmod করবেন তবে কোনও ফাইল নেই (পুনরাবৃত্ত)?

বিপরীতে, কীভাবে কেবল ফাইলগুলি (পুনরাবৃত্তভাবে) chmod করবেন তবে কোনও ডিরেক্টরি নেই?


সম্পর্কিত: ডিরেক্টরি এর সমস্ত ফাইল এবং ফোল্ডার অনুমতিগুলি এসও
কেনারব

উত্তর:


801

পুনরাবৃত্তভাবে ডিরেক্টরিগুলি পড়ুন এবং কার্যকর করুন:

find /path/to/base/dir -type d -exec chmod 755 {} +

পুনরাবৃত্তভাবে ফাইলগুলি পড়ার সুযোগগুলি দিতে :

find /path/to/base/dir -type f -exec chmod 644 {} +

বা, যদি প্রক্রিয়া করার জন্য অনেকগুলি অবজেক্ট থাকে:

chmod 755 $(find /path/to/base/dir -type d)
chmod 644 $(find /path/to/base/dir -type f)

বা, chmodspawning হ্রাস করার জন্য :

find /path/to/base/dir -type d -print0 | xargs -0 chmod 755 
find /path/to/base/dir -type f -print0 | xargs -0 chmod 644

7
প্রথম দুটি উদাহরণ অনেকগুলি ফাইল ডিরেক্টরি ব্যর্থ: -bash: /bin/chmod: Argument list too long। শেষ কমান্ডটি অনেকগুলি ফাইলের সাথে কাজ করে, তবে sudofind /path/to/base/dir -type d -print0 | sudo xargs -0 chmod 755
কোনওটি

2
এছাড়াও লক্ষণীয়, এই কমান্ডগুলি বেস dir সহ অন্তর্ভুক্ত । তাই উপরের উদাহরণে, dirএছাড়াও 755. সেট করা হবে
CenterOrbit

2
chmod ... $(find /path/to/base/dir -type ...)নামে ফাঁকা স্থান সহ ফাইলের নাম ব্যর্থ করে।
ড্যান ড্যাসক্লেস্কু

7
আমি মনে করি ফাইলের নাম এবং ফাইলের সংখ্যার মধ্যে স্পেস এবং চিহ্নগুলির সাথে সর্বাধিক সঠিক (তবে দ্রুত নয়) সংস্করণটি find /path/to/base/dir -type d -exec chmod 755 {} \;( find /path/to/base/dir -type f -exec chmod 644 {} \;)।
পিটার কে

মনে রাখবেন এটি কেবল প্রথম স্তরটিতে যায় যা এটি পড়তে পারে। ডিরেক্টরি গাছের গভীরে যাওয়ার জন্য আপনাকে বেশ কয়েকবার এটি সম্পাদন করতে হবে।
হেন্ক পোলি

290

এই ধরণের জিনিসটির একটি সাধারণ কারণ হ'ল ডিরেক্টরিগুলি 755 তে সেট করা হয় তবে ফাইলগুলি 644-এ সেট করা যায় this এক্ষেত্রে নিকের findউদাহরণের চেয়ে কিছুটা দ্রুত উপায় আছে :

chmod -R u+rwX,go+rX,go-w /path

অর্থ:

  • -R = পুনরাবৃত্তির সাথে;
  • u+rwX = ব্যবহারকারীরা পড়তে, লিখতে এবং চালাতে পারেন;
  • go+rX = গোষ্ঠী এবং অন্যান্যরা পড়তে এবং সম্পাদন করতে পারে;
  • go-w = গ্রুপ এবং অন্যরা লিখতে পারে না

এখানে লক্ষণীয় গুরুত্বপূর্ণ বিষয় হ'ল বড় হাতের Xঅক্ষরগুলি লোয়ারকেসে আলাদাভাবে কাজ করে x। ম্যানুয়ালটিতে আমরা পড়তে পারি:

ফাইলটি ডিরেক্টরি হলে এক্সিকিউট / অনুসন্ধান বিটগুলি বা এক্সিকিউট / অনুসন্ধান বিটগুলির মধ্যে কোনও আসল (অবিবর্তিত) মোডে সেট করা থাকে।

অন্য কথায়, কোনও ফাইলের chmod u + X এক্সিকিউটিভ বিট সেট করে না; এবং জি + এক্স কেবলমাত্র এটি সেট করবে যদি এটি ইতিমধ্যে ব্যবহারকারীর জন্য সেট করা থাকে।


5
-আর = পুনরাবৃত্তির সাথে; u + rwX = ব্যবহারকারীরা পড়তে, লিখতে এবং চালাতে পারেন; গো + আরএক্স = গোষ্ঠী এবং অন্যরা পড়তে এবং সম্পাদন করতে পারে; go-w = গোষ্ঠী এবং অন্যরা লিখতে পারবেন না
släcker

23
এই প্যাটার্নটি পরিস্থিতি স্থির করবে না chmod -R 777যেহেতু +Xবিকল্পটি ফাইলগুলিতে বিদ্যমান এক্সিকিউট বিটগুলি পুনরায় সেট করবে না এমন সময় থেকে কেউ কাজ করেছে । -X ব্যবহারের ফলে ডিরেক্টরিগুলি পুনরায় সেট হবে, এবং সেগুলিতে উত্থান রোধ করবে।
অ্যান্ড্রু ভিট

3
@ রিং0: আমি প্রশ্নের উত্তরটিকে আক্ষরিকভাবে উত্থাপিত হিসাবে দিতে চাইছি না - নিক ইতিমধ্যে এটি পুরোপুরিভাবে ভাল করে ফেলেছে। আমি সর্বাধিক সাধারণ ক্ষেত্রে সস্তার সমাধানটি নির্দেশ করছি। এবং হ্যাঁ, Xমন্তব্যে বর্ণিত হিসাবে আপনি ফাইল এবং ডিরেক্টরিগুলির জন্য বিভিন্ন অনুমতি পেয়েছেন ।
বোবিনস

6
go+rX,go-w-> go=rXতাই না?
পিয়েরে লেস্পিনে

5
chmod u-x,u+Xফাইলগুলির এক্সিকিউট বিট অপসারণ করতে আপনি সংমিশ্রণ ইত্যাদি ব্যবহার করতে পারেন, তবে সেগুলি ডিরেক্টরিতে যুক্ত করতে পারেন।
w0rp

14

যদি আপনি নিশ্চিত করতে চান যে ফাইলগুলি 644-এ সেট করা আছে এবং সেখানে যে ফাইলগুলিতে মৃত্যুদন্ড কার্যকর করা আছে সেখানে এমন ফাইল রয়েছে তবে আপনাকে প্রথমে এক্সিকিউট ফ্ল্যাগটি সরিয়ে ফেলতে হবে। + এক্স ইতিমধ্যে এটি থাকা ফাইলগুলি থেকে এক্সিকিউট ফ্ল্যাগটি সরিয়ে দেয় না।

উদাহরণ:

chmod -R ugo-x,u+rwX,go+rX,go-w path

আপডেট: এটি ব্যর্থ বলে মনে হচ্ছে কারণ প্রথম পরিবর্তন (ugo-x) ডিরেক্টরিটিকে অনিবার্য করে তোলে, সুতরাং এর নীচে সমস্ত ফাইল পরিবর্তন করা হয়নি।


1
এটি আমার পক্ষে কাজ করে, এবং কেন হয় না তা আমি দেখতে পাই না। (অবশ্যই, আপনি যদি এটি ঠিক করেন chmod -R ugo-x pathতবে এটি একটি সমস্যা হতে পারে But তবে সম্পূর্ণ কমান্ড chmod u+rwXপ্রতিটি ডিরেক্টরিতে এটি নামার চেষ্টা করার আগে এটি করবে)) তবে আমি বিশ্বাস করি chmod R u=rw,go=r,a+X pathএটি যথেষ্ট - এবং এটি সংক্ষিপ্ত।
স্কট

আমি এটি সঠিকভাবে কাজ পেয়েছি; ডিরেক্টরিতে প্রবেশের সাথে কোনও সমস্যা ছিল না
কেউ সোমও কোথাও

4

আমি নিজেই এই জন্য একটি ছোট স্ক্রিপ্ট লেখার সিদ্ধান্ত নিয়েছি।

ডায়ার এবং / অথবা ফাইলগুলির জন্য পুনরাবৃত্ত chmod স্ক্রিপ্ট - সংক্ষেপ :

chmodr.sh

#!/bin/sh
# 
# chmodr.sh
#
# author: Francis Byrne
# date: 2011/02/12
#
# Generic Script for recursively setting permissions for directories and files
# to defined or default permissions using chmod.
#
# Takes a path to recurse through and options for specifying directory and/or 
# file permissions.
# Outputs a list of affected directories and files.
# 
# If no options are specified, it recursively resets all directory and file
# permissions to the default for most OSs (dirs: 755, files: 644).

# Usage message
usage()
{
  echo "Usage: $0 PATH -d DIRPERMS -f FILEPERMS"
  echo "Arguments:"
  echo "PATH: path to the root directory you wish to modify permissions for"
  echo "Options:"
  echo " -d DIRPERMS, directory permissions"
  echo " -f FILEPERMS, file permissions"
  exit 1
}

# Check if user entered arguments
if [ $# -lt 1 ] ; then
 usage
fi

# Get options
while getopts d:f: opt
do
  case "$opt" in
    d) DIRPERMS="$OPTARG";;
    f) FILEPERMS="$OPTARG";;
    \?) usage;;
  esac
done

# Shift option index so that $1 now refers to the first argument
shift $(($OPTIND - 1))

# Default directory and file permissions, if not set on command line
if [ -z "$DIRPERMS" ] && [ -z "$FILEPERMS" ] ; then
  DIRPERMS=755
  FILEPERMS=644
fi

# Set the root path to be the argument entered by the user
ROOT=$1

# Check if the root path is a valid directory
if [ ! -d $ROOT ] ; then
 echo "$ROOT does not exist or isn't a directory!" ; exit 1
fi

# Recursively set directory/file permissions based on the permission variables
if [ -n "$DIRPERMS" ] ; then
  find $ROOT -type d -print0 | xargs -0 chmod -v $DIRPERMS
fi

if [ -n "$FILEPERMS" ] ; then
  find $ROOT -type f -print0 | xargs -0 chmod -v $FILEPERMS
fi

এটি মূলত রিকার্সিভ chmod করে তবে কমান্ড লাইন বিকল্পগুলির জন্য কিছুটা নমনীয়তা সরবরাহ করে (ডিরেক্টরি এবং / অথবা ফাইলের অনুমতি নির্ধারণ করে, বা উভয়কে বাদ দেয়) এটি সবকিছু স্বয়ংক্রিয়ভাবে 755-644 এ পুনরায় সেট করে। এটি কয়েকটি ত্রুটি পরিস্থিতিও পরীক্ষা করে।

আমি আমার ব্লগে এটি সম্পর্কে লিখেছি ।


2

পুনরাবৃত্তভাবে ডিরেক্টরিগুলি পড়ুন এবং কার্যকর করুন:

find /path/to/base/dir -type d -exec chmod 755 {} \;

পুনরাবৃত্তভাবে ফাইলগুলি পড়ার সুযোগগুলি দিতে :

find /path/to/base/dir -type f -exec chmod 644 {} \;

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


এই হল ডাউনগ্রেড এর Nik এর উত্তর । আপনি কেন বিশ্বাস করেন যে নিকের উত্তরের সাথে কিছু ভুল আছে?
স্কট

@ স্কট, নিক এর উত্তর (ভিউ) বিপুল সংখ্যক ফাইলের সাথে ব্যর্থ।
পিটার কে

আমি 99% নিশ্চিত যে আপনি ভুল করেছেন। আপনার দাবি সমর্থন করার জন্য আপনি কোনও প্রমাণ সরবরাহ করতে পারেন?
স্কট

হ্যাঁ, মনে হচ্ছে আমি সত্যিই ভুল। সন্ধান করুন ... + মনে হচ্ছে লাইনটি একাধিক কমান্ডে বিভক্ত হয়েছে, দুর্দান্ত ধরা!
পিটার কে

0

এই অজগর লিপি চেষ্টা করুন; এটির জন্য কোনও প্রক্রিয়াজাতকরণের প্রয়োজন নেই এবং প্রতি ফাইলটিতে দুটি মাত্র স্কাইস্কল করে। সি তে বাস্তবায়ন ছাড়া এটি সম্ভবত এটি করার দ্রুততম উপায় (15 মিলিয়ন ফাইলের একটি ফাইল সিস্টেম ঠিক করার জন্য আমার এটির দরকার ছিল যা সবগুলি 777 এ সেট করা হয়েছিল)

#!/usr/bin/python3
import os
for par, dirs, files in os.walk('.'):
    for d in dirs:
        os.chmod(par + '/' + d, 0o755)
    for f in files:
        os.chmod(par + '/' + f, 0o644)

আমার ক্ষেত্রে, শেষ chmod এর আশেপাশে একটি চেষ্টা / ধরার প্রয়োজন ছিল, যেহেতু কিছু বিশেষ ফাইলের কোডচডিং ব্যর্থ হয়েছিল।


-1

আপনি এটি ব্যবহার করতে পারেন tree:

tree -faid /your_directory | xargs -L1 -I{} bash -c 'sudo chmod 755 "$1"' -- '{}'

এবং আপনি যদি ফোল্ডারটি দেখতে চান তবে একটি প্রতিধ্বনি যুক্ত করুন

 tree -faid /your_directory | xargs -L1 -I{} bash -c 'sudo chmod 755 "$1" && echo$1' -- '{}'

@ স্কট 1) আপনি ঠিক + x আমি 755 এ পরিবর্তন করেছেন; 2) 3) এটি সমাধান করার জন্য আমি স্থানধারককে এই '}}' এর মতো একক উদ্ধৃতিতে
রেখেছি

@ স্কট আমি সম্মত হলাম এটি সর্বোত্তম উত্তরটি ধীর নয়, তবে "যুক্তিবাদী" উদ্দেশ্যেও মন্তব্যগুলি আরও ব্যাখ্যা করবে এবং লোকেরা xargsসমস্যাগুলি সম্পর্কে জানতে পারে । ফাইলের
নামগুলিতে

@ স্কট আমার সিস্টেমে আমি সমস্ত ফাইল অনুসন্ধান করেছিলাম যার মধ্যে একক উদ্ধৃতি রয়েছে এবং একক উদ্ধৃতি প্রতিস্থাপন করা হয়েছে
এডুয়ার্ড ফ্লোরিয়েন্সকু

@ স্কট আপনি এই সত্যটি কীভাবে ঠিক করবেন যে এক্সার্গস একক উদ্ধৃতি সঠিকভাবে সমাধান করে না?
এডুয়ার্ড ফ্লোরিইনসকু


-2

আপনি উদাহরণ হিসাবে নীচের বাশ স্ক্রিপ্ট ব্যবহার করতে পারেন। এটি নির্বাহযোগ্য অনুমতি (755) দেওয়ার বিষয়ে নিশ্চিত হন। কেবলমাত্র বর্তমান ডিরেক্টরিটির জন্য ./autochmod.sh ব্যবহার করুন বা একটি আলাদা নির্দিষ্ট করতে। /Autochmod.sh <dir> ব্যবহার করুন।

#!/bin/bash

if [ -e $1 ]; then
    if [ -d $1 ];then
        dir=$1
    else
        echo "No such directory: $1"
        exit
    fi
else
    dir="./"
fi

for f in $(ls -l $dir | awk '{print $8}'); do
    if [ -d $f ];then
        chmod 755 $f
    else
        chmod 644 $f
    fi
done

2
কি দারুন! এত সমস্যা! (1) যদি $1শূন্য না হয় তবে কোনও ডিরেক্টরিটির নাম না হয় (যেমন, একটি টাইপো), তবে কোনও বার্তা ছাড়াই dirসেট হয়ে যায় .। (২) $1হওয়া উচিত "$1"এবং $dirহওয়া উচিত "$dir"। (3) আপনার বলার দরকার নেই "./"; "."ভাল (এবং, কঠোরভাবে বলতে গেলে, আপনার এখানে উদ্ধৃতিগুলির প্রয়োজন নেই)। (4) এটি কোনও পুনরাবৃত্ত সমাধান নয়। (5) আমার সিস্টেমে ls -l … | awk '{ print $8 }'ফাইলগুলির পরিবর্তনের সময়গুলি পাওয়া যায়। আপনার যা দরকার তা { print $9 }পেতে প্রথম শব্দ ফাইলের নাম। এবং তারপরেও (6) এটি সাদা জায়গার সাথে ফাইলের নামগুলি পরিচালনা করে না। …
স্কট

1
… এবং, সর্বশেষে তবে অন্তত নয় (not) যদি এই স্ক্রিপ্টটি বর্তমান ডিরেক্টরিতে থাকে তবে এটি chmod নিজেই will৪৪ এ উন্নীত হবে, সুতরাং এটি নিজেকে অ-কার্যকরকরণযোগ্য করে তুলবে !
স্কট
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.