2010-01-06 01:56:57 +0000 2010-01-06 01:56:57 +0000
593
593

Как рекурсивно схмодировать все каталоги кроме файлов?

Как схмодировать 755 все каталоги кроме файлов (рекурсивно) ?

Обратно, как схмодировать только файлы (рекурсивно) но не каталоги ?

Ответы (8)

821
821
821
2010-01-06 01:58:44 +0000

Чтобы рекурсивно дать ** каталогов** привилегии чтения и выполнения:

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

Чтобы рекурсивно дать files привилегии чтения:

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
302
302
302
2010-01-06 03:22:25 +0000

Частой причиной такого рода вещей является установка каталогов в 755, а файлов в 644. В данном случае есть несколько более быстрый способ, чем пример nik find:

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

Значение:

  • -R = рекурсивно;
  • u+rwX = пользователи могут читать, писать и выполнять;
  • go+rX = группа и другие могут читать и выполнять;
  • go-w = группа и другие не могут писать

Важно отметить здесь, что заглавный X действует иначе, чем строчный x. В руководстве мы можем прочитать:

Биты execute/search, если файл является каталогом или любой из битов execute/search установлены в исходном (немодифицированном) режиме.

Другими словами, chmod u+X на файле не будет устанавливать бит execute; а g+X будет устанавливать его только в том случае, если он уже установлен для пользователя.

14
14
14
2010-01-22 16:14:43 +0000

Если вы хотите удостовериться, что файлы установлены в 644 и в пути есть файлы с флагом execute, то сначала необходимо снять флаг execute. +X не удаляет флаг execute из файлов, которые уже имеют его.

Пример:

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

Обновление: это выглядит неудачно, потому что первое изменение (ugo-x) делает каталог неисполняемым, так что все файлы под ним не меняются.

4
4
4
2012-09-18 14:00:17 +0000

Я решил написать небольшой сценарий для этого сам. Recursive chmod script for dirs and/or files - Gist :

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
2
2
2018-02-21 11:58:41 +0000

Чтобы рекурсивно дать директорий привилегии чтения и выполнения:

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

Чтобы рекурсивно дать files привилегии чтения:

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

Лучше поздно, чем никогда не позволяйте мне обновить ответ Ника на стороне правильности. Мое решение медленнее, но оно работает с любым количеством файлов, с любыми символами в именах файлов, и вы можете запустить его с sudo обычно (но остерегайтесь, что он может обнаружить различные файлы с sudo).

0
0
0
2013-03-26 04:37:44 +0000

Попробуйте этот питоновый скрипт; он не требует порождения процессов и делает только два системных масштаба на файл. Кроме реализации на C, это, вероятно, будет самым быстрым способом сделать это (он был мне нужен, чтобы исправить файловую систему из 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, так как chmodding некоторые специальные файлы не удалось.

-1
-1
-1
2018-02-16 09:34:58 +0000

Вы также можете использовать 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' -- '{}'
-2
-2
-2
2010-01-29 11:56:05 +0000

В качестве примера можно использовать следующий бэш-скрипт. Не забудьте дать ему исполняемые права (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

Похожие вопросы

5
12
7
8
1