कैसे 755 सभी निर्देशिकाओं को chmod करें लेकिन कोई फ़ाइल (पुनरावर्ती) नहीं?
इसके विपरीत, केवल फ़ाइलों (पुनरावर्ती) के लिए कैसे करें लेकिन कोई निर्देशिका नहीं है?
कैसे 755 सभी निर्देशिकाओं को chmod करें लेकिन कोई फ़ाइल (पुनरावर्ती) नहीं?
इसके विपरीत, केवल फ़ाइलों (पुनरावर्ती) के लिए कैसे करें लेकिन कोई निर्देशिका नहीं है?
जवाबों:
निर्देशिकाओं को पुनरावर्ती रूप से देना और विशेषाधिकारों को निष्पादित करना:
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)
या, कम करने के लिए chmod
:
find /path/to/base/dir -type d -print0 | xargs -0 chmod 755
find /path/to/base/dir -type f -print0 | xargs -0 chmod 644
-bash: /bin/chmod: Argument list too long
:। अंतिम कमांड कई फाइलों के साथ काम करती है, लेकिन जब sudo
किसी को chmod के बजाय xargs से पहले इसे रखने के लिए सावधानी बरतनी चाहिए:find /path/to/base/dir -type d -print0 | sudo xargs -0 chmod 755
dir
755 पर भी सेट किया जाएगा।
chmod ... $(find /path/to/base/dir -type ...)
नाम में रिक्त स्थान के साथ फ़ाइल नाम के लिए विफल रहता है।
find /path/to/base/dir -type d -exec chmod 755 {} \;
( find /path/to/base/dir -type f -exec chmod 644 {} \;
)।
इस तरह की चीज़ों के लिए एक सामान्य कारण 755 में निर्देशिकाओं को सेट करना है, लेकिन फाइलें 644 में हैं। इस मामले में नीक के find
उदाहरण की तुलना में थोड़ा तेज तरीका है :
chmod -R u+rwX,go+rX,go-w /path
अर्थ:
-R
= पुनरावर्ती;u+rwX
= उपयोगकर्ता पढ़ सकते हैं, लिख सकते हैं और निष्पादित कर सकते हैं;go+rX
= समूह और अन्य पढ़ और निष्पादित कर सकते हैं;go-w
= समूह और अन्य नहीं लिख सकते हैंयहां ध्यान देने योग्य बात यह है कि अपरकेस X
लोअरकेस में अलग तरह से कार्य करता है x
। मैनुअल में हम पढ़ सकते हैं:
निष्पादन / खोज बिट्स यदि फ़ाइल एक निर्देशिका है या निष्पादन / खोज बिट्स मूल (अनमॉडिफाइड) मोड में सेट की गई हैं।
दूसरे शब्दों में, फ़ाइल पर chmod u + X निष्पादित बिट को सेट नहीं करेगा; और g + X इसे केवल तभी सेट करेगा यदि यह उपयोगकर्ता के लिए पहले से ही सेट है।
chmod -R 777
क्योंकि +X
विकल्प फ़ाइलों पर मौजूदा निष्पादित बिट्स को रीसेट नहीं करेगा। -X का उपयोग निर्देशिकाओं को रीसेट करेगा, और उनमें उतरने से रोकेगा।
X
, जैसा कि टिप्पणियों में बताया गया है।
go+rX,go-w
-> go=rX
है ना?
chmod u-x,u+X
फ़ाइलों के लिए निष्पादन बिट्स को निकालने के लिए संयोजन आदि में भी उपयोग कर सकते हैं , लेकिन उन्हें निर्देशिकाओं के लिए जोड़ सकते हैं।
यदि आप यह सुनिश्चित करना चाहते हैं कि फाइलें 644 पर सेट की गई हैं और रास्ते में ऐसी फाइलें हैं जिनमें निष्पादन ध्वज है, तो आपको पहले निष्पादित ध्वज को हटाना होगा। + X उन फ़ाइलों से निष्पादन ध्वज को नहीं हटाता है जिनके पास पहले से है।
उदाहरण:
chmod -R ugo-x,u+rwX,go+rX,go-w path
अद्यतन: यह विफल प्रतीत होता है क्योंकि पहला परिवर्तन (ugo-x) निर्देशिका को अप्राप्य बनाता है, इसलिए इसके नीचे की सभी फाइलें परिवर्तित नहीं होती हैं।
chmod -R ugo-x path
यह एक समस्या हो सकती है। लेकिन पूरी कमान chmod u+rwX
प्रत्येक निर्देशिका पर करेगी, इससे पहले कि वह इसमें उतर जाए।) हालांकि, मेरा मानना है कि chmod R u=rw,go=r,a+X path
यह पर्याप्त है - और यह छोटा है।
मैंने खुद इसके लिए थोड़ी स्क्रिप्ट लिखने का फैसला किया।
डायर और / या फ़ाइलों के लिए पुनरावर्ती 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 को सब कुछ रीसेट करता है)। यह कुछ त्रुटि परिदृश्यों के लिए भी जाँच करता है।
मैंने इसके बारे में अपने ब्लॉग पर भी लिखा था ।
निर्देशिकाओं को पुनरावर्ती रूप से देना और विशेषाधिकारों को निष्पादित करना:
find /path/to/base/dir -type d -exec chmod 755 {} \;
फ़ाइलों को विशेष रूप से पढ़ने के लिए पुनरावर्ती देना :
find /path/to/base/dir -type f -exec chmod 644 {} \;
देर से बेहतर मुझे कभी भी नीक के उत्तर को शुद्धता के पक्ष में अपग्रेड नहीं करने दिया। मेरा समाधान धीमा है, लेकिन यह फ़ाइल नाम में किसी भी प्रतीक के साथ, किसी भी संख्या में फ़ाइलों के साथ काम करता है, और आप इसे सामान्य रूप से sudo के साथ चला सकते हैं (लेकिन सावधान रहें कि यह sudo के साथ विभिन्न फ़ाइलों की खोज कर सकता है)।
इस अजगर स्क्रिप्ट की कोशिश करो; इसके लिए प्रक्रियाओं की स्पानिंग की आवश्यकता नहीं है और प्रति फ़ाइल केवल दो syscalls करता है। सी में एक कार्यान्वयन के अलावा, यह शायद इसे करने का सबसे तेज़ तरीका होगा (मुझे 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 के आसपास एक कोशिश / पकड़ की आवश्यकता थी, क्योंकि कुछ विशेष फ़ाइलों को चकमा देने में विफल रहा।
आप यह भी उपयोग कर सकते हैं 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' -- '{}'
xargs
मुद्दों के बारे में भी जान सकते हैं। फ़ाइलनाम में एकल उद्धरण स्वयं कई आदेशों और स्क्रिप्ट के लिए एक समस्या है यही कारण है कि मैंने सभी फ़ाइलों को एकल उद्धरणों के साथ सूचीबद्ध किया और उन्हें हटा दिया (उद्धरण मेरा मतलब है)
आप उदाहरण के रूप में निम्नलिखित बैश स्क्रिप्ट का उपयोग कर सकते हैं। इसे निष्पादन योग्य अनुमति (755) अवश्य दें। बस का उपयोग करें। / currentochmod.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
$1
अशक्त नहीं है, लेकिन निर्देशिका का नाम नहीं है (जैसे, एक टाइपो है), तो बिना किसी संदेश के dir
सेट हो जाता है .
। (२) $1
होना चाहिए "$1"
और $dir
होना चाहिए "$dir"
। (३) आपको कहने की आवश्यकता नहीं है "./"
; "."
ठीक है (और, सख्ती से बोलते हुए, आपको यहां उद्धरणों की आवश्यकता नहीं है)। (४) यह पुनरावर्ती समाधान नहीं है। (५) मेरे सिस्टम में, ls -l … | awk '{ print $8 }'
फाइलों का संशोधन समय पर होता है। आपको फ़ाइल नाम का पहला शब्द{ print $9 }
प्राप्त करने की आवश्यकता है । और फिर भी, (6) यह सफेद स्थान के साथ फ़ाइल नाम को संभाल नहीं करता है। ...
chmod
ही होगी , इस प्रकार यह स्वयं को गैर-निष्पादन योग्य बना देगा!