ලිපිගොනු හැර අනෙකුත් සියලුම නාමාවලි පුනරාවර්තනය කරන්නේ කෙසේද?


602

සියලුම නාමාවලි 755 chmod කරන්නේ කෙසේද නමුත් ගොනුවක් නොමැත (පුනරාවර්තන ලෙස)?

ප්‍රතිලෝමව, ගොනු පමණක් (පුනරාවර්තන ලෙස) chmod කරන්නේ කෙසේද?



Answers:


836

ඇත්තෙන් වෙනසට භාජනය දෙන්න බහලුම් වරප්රසාද කියවීමට සහ ක්රියාත්මක:

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

7
ලිපිගොනු විශාල ප්‍රමාණයක් ඇති නාමාවලි සඳහා පළමු උදාහරණ දෙක අසමත් වේ : -bash: /bin/chmod: Argument list too long. අවසාන විධානය බොහෝ ලිපිගොනු සමඟ ක්‍රියා කරයි, නමුත් sudoඑකක් භාවිතා කරන විට එය chmod වෙනුවට xargs ඉදිරියේ තැබීමට ප්‍රවේශම් විය යුතුය:find /path/to/base/dir -type d -print0 | sudo xargs -0 chmod 755
Agargara

2
තවද මෙම විධානයන් පදනම් dir ඇතුළත් වේ. එබැවින් ඉහත උදාහරණයේ දී dir755 ට ද සකසනු ඇත.
CentreOrbit

2
chmod ... $(find /path/to/base/dir -type ...)නාමයේ ඉඩ ඇති ගොනු නාම සඳහා අසමත් වේ.
ඩෑන් ඩස්කල්ස්කු

8
මම හිතන්නේ ගොනු නාමය දී ස්ථාන සහ සංකේත සම්බන්ධයෙන් සහ ගොනු අංකය සමග එය වඩාත් නිවැරදි (නමුත් වේගවත්ම) අනුවාදය find /path/to/base/dir -type d -exec chmod 755 {} \;( find /path/to/base/dir -type f -exec chmod 644 {} \;).
පීටර් කේ

මෙය කියවිය හැක්කේ පළමු ස්ථරයට පමණක් බව සලකන්න. නාමාවලි ගසට ගැඹුරට යාමට ඔබට එය කිහිප වතාවක් ක්‍රියාත්මක කිරීමට සිදුවේ.
හෙන්ක් පොලී

305

මෙවැනි දේ සඳහා පොදු හේතුවක් වන්නේ නාමාවලි 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 එය සැකසෙන්නේ එය දැනටමත් පරිශීලකයා සඳහා සකසා ඇත්නම් පමණි.


5
-R = පුනරාවර්තන ලෙස; u + rwX = පරිශීලකයින්ට කියවීමට, ලිවීමට සහ ක්‍රියාත්මක කිරීමට හැකිය; go + rX = කණ්ඩායම සහ අනෙක් අයට කියවා ක්‍රියාත්මක කළ හැකිය; go-w = කණ්ඩායමට සහ අනෙක් අයට ලිවිය නොහැක
släcker

25
මෙම රටාව යමෙකු කර ඇති විට තත්වය නිවැරදි නොකරනු ඇත, chmod -R 777මන්දයත් +Xවිකල්පය ගොනු වල පවතින ක්‍රියාත්මක බිටු නැවත සකසන්නේ නැත. -X භාවිතා කිරීමෙන් නාමාවලි යළි පිහිටුවනු ඇති අතර ඒවාට බැසයාම වලක්වනු ඇත.
ඇන්ඩ rew විට

3
@ ring0: ප්‍රශ්නයට වචනානුසාරයෙන් පිළිතුරු දීමට මම අදහස් නොකරමි - නික් දැනටමත් එය හොඳින් කර ඇත. මම වඩාත් පොදු අවස්ථාව සඳහා ලාභදායී විසඳුමක් පෙන්වා දෙමි. ඔව්, Xඅදහස් දැක්වීමේදී පැහැදිලි කර ඇති පරිදි ගොනු සහ නාමාවලි සඳහා ඔබට විවිධ අවසරයන් ලැබේ .
බොබින්ස්

6
go+rX,go-w-> go=rXඑහෙම නේද?
පියරේ ඩි ලෙස්පිනේ

5
chmod u-x,u+Xලිපිගොනු සඳහා ක්‍රියාත්මක බිටු ඉවත් කිරීමට ඔබට සංයුක්ත යනාදිය භාවිතා කළ හැකිය , නමුත් ඒවා නාමාවලි සඳහා එක් කරන්න.
w0rp

15

ලිපිගොනු 644 ලෙස සකසා ඇති බවත්, ක්‍රියාත්මක කිරීමේ ධජය ඇති මාවතේ ගොනු ඇති බවත් තහවුරු කර ගැනීමට ඔබට අවශ්‍ය නම්, ඔබ මුලින්ම ක්‍රියාත්මක ධජය ඉවත් කළ යුතුය. + X මඟින් දැනටමත් ක්‍රියාත්මක කර ඇති ධජයෙන් එය ඉවත් නොකරයි.

උදාහරණයක්:

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

යාවත්කාලීන කිරීම: පළමු වෙනස (ugo-x) බහලුම ක්‍රියාත්මක කළ නොහැකි බැවින් මෙය අසාර්ථක වන බව පෙනේ, එබැවින් එයට යටින් ඇති සියලුම ගොනු වෙනස් නොවේ.


1
මෙය මට ප්‍රයෝජනවත් වන අතර එය එසේ නොවන්නේ මන්දැයි මම නොදනිමි. (ෂුවර්, ඔබ එසේ කළා නම් chmod -R ugo-x pathඑය ගැටළුවක් විය හැකිය. නමුත් සම්පූර්ණ විධානය මඟින් chmod u+rwXසෑම ඩිරෙක්ටරියක්ම එයට බැසීමට පෙර එය කරනු ඇත.) කෙසේ වෙතත්, chmod R u=rw,go=r,a+X pathඑය ප්‍රමාණවත් යැයි මම විශ්වාස කරමි - එය කෙටි වේ.
ස්කොට්

මෙය නිසියාකාරව ක්‍රියාත්මක වන බව මට පෙනී ගියේය; නාමාවලි ඇතුළත් කිරීමේදී කිසිදු ගැටළුවක් නොවීය
SomeoneSomewhereSupportsMonica

පිළිවෙලට, මෙය විශිෂ්ටයි-
ජෙසී සී

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 {} \;

නිරවද්‍යතාවයේ පැත්තෙන් නික්ගේ පිළිතුර උත්ශ්‍රේණි කිරීමට මට කිසි විටෙකත් ඉඩ නොදීමට වඩා හොඳය. මගේ විසඳුම මන්දගාමී ය, නමුත් එය ඕනෑම ගොනු ගණනක් සමඟ, ගොනු නාමවල ඕනෑම සංකේතයක් සමඟ ක්‍රියා කරයි, ඔබට එය සාමාන්‍යයෙන් sudo සමඟ ධාවනය කළ හැකිය (නමුත් එය සූඩෝ සමඟ විවිධ ගොනු සොයා ගනු ඇතැයි පරිස්සම් වන්න).


මේ එය පහළ දැමීමටnik පිළිතුර . නික්ගේ පිළිතුරේ කිසියම් වැරැද්දක් ඇතැයි ඔබ විශ්වාස කරන්නේ ඇයි?
ස්කොට්

C ස්කොට්, නික්ගේ පිළිතුර විශාල ගොනු සංඛ්‍යාවක් සමඟ අසමත් වේ.
පීටර් කේ

මට වැරදුන බව මට 99% ක් විශ්වාසයි. ඔබගේ හිමිකම් පෑමට සහාය දැක්වීමට ඔබට සාක්ෂි ඉදිරිපත් කළ හැකිද?
ස්කොට්

ඔව්, පෙනෙන විදිහට මම ඇත්තටම වැරදියි. find ... + පේළිය බහුවිධ විධාන වලට කැඩෙන බවක් පෙනේ.
පීටර් කේ

1

මෙම පයිතන් පිටපත උත්සාහ කරන්න; එයට ක්‍රියාවලියක් ඇතිවීම අවශ්‍ය නොවන අතර එක් ගොනුවකට සිස්කල් දෙකක් පමණක් අවශ්‍ය වේ. සී හි ක්‍රියාත්මක කිරීමක් හැරුණු විට, එය වේගවත්ම ක්‍රමය වනු ඇත (777 ලෙස සකසා ඇති ගොනු මිලියන 15 ක ගොනු පද්ධතියක් සවි කිරීමට මට එය අවශ්‍ය විය)

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

මගේ නඩුවේදී, සමහර විශේෂ ලිපිගොනු chmoding අසමත් වූ බැවින්, අවසාන 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' -- '{}'

C ස්කොට් 1) ඔබ + x ගැන හරි, මම 755 ට වෙනස් කළෙමි; 2) 3) මෙය විසඳීම සඳහා මම ස්ථානගත කරන්නා මේ වගේ තනි උපුටා දැක්වීමක
තැබුවෙමි

C ස්කොට් මම එකඟ වෙමි මෙය හොඳම පිළිතුර ද මන්දගාමී නොවන නමුත් "උපදේශාත්මක" අරමුණු සඳහා මෙහි පිටත් වන අතර අදහස් තවදුරටත් පැහැදිලි කරනු ඇත, එසේම මිනිසුන්ට xargsගැටළු පිළිබඳව ඉගෙන ගත හැකිය . ගොනු නාමයන්හි තනි උපුටා දැක්වීම් බොහෝ විධාන සහ ස්ක්‍රිප්ට් සඳහාම ගැටළුවක් වන අතර ඒ නිසා මම තනි ගොනු අඩංගු සියලුම ලිපිගොනු ලැයිස්තුගත කර ඒවා ඉවත් කළෙමි (මා අදහස් කළ උපුටා දැක්වීම්)
එඩ්වඩ් ෆ්ලොරිනෙස්කු

C ස්කොට් මගේ පද්ධතිවල මම තනි උපුටා දැක්වීම් අඩංගු සියලුම ලිපිගොනු සෙවූ අතර තනි මිල ගණන් ආදේශ
කළෙමි

Sc ස්කොට් එක් උපුටා දැක්වීම් xargs නිවැරදිව විසඳන්නේ නැති බව ඔබ නිවැරදි කරන්නේ කෙසේද?
එඩ්වඩ් ෆ්ලොරිනෙස්කු


-2

ඔබට පහත දැක්වෙන bash ස්ක්‍රිප්ට් උදාහරණයක් ලෙස භාවිතා කළ හැකිය. එය ක්‍රියාත්මක කළ හැකි අවසර ලබා දීමට වග බලා ගන්න (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සකසනු ලැබේ .. (2) $1විය යුතු "$1"හා $dirවිය යුතුය "$dir". (3) ඔබට කීමට අවශ්‍ය නැත "./"; "."හොඳයි (සහ, තදින්ම කිවහොත්, ඔබට මෙහි උපුටා දැක්වීම් අවශ්‍ය නොවේ). (4) මෙය පුනරාවර්තන විසඳුමක් නොවේ. (5) මගේ පද්ධතියේ, ls -l … | awk '{ print $8 }'ගොනු වෙනස් කිරීමේ වේලාවන් ලබා ගනී. ගොනු නාමයේ පළමු වචනය{ print $9 } ලබා ගැනීමට ඔබට අවශ්‍යය . එසේ වුවද, (6) මෙය සුදු පැහැති ඉඩක් සහිත ගොනු නාමයන් හසුරුවන්නේ නැත. …
ස්කොට්

1
... ඒ වගේම, පසුගිය නමුත් අවම වශයෙන් නොවේ (∞) මෙම තිර රචනය වත්මන් නාමාවලියේ නම්, එය chmod 644 දක්වා, මේ අනුව,-ක්රියාකාරී නොවන ම කරමින්!
ස්කොට්
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.