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

Как к chmod 755 все каталоги, но никакой файл (рекурсивно)?

Обратно пропорционально, как к chmod только файлы (рекурсивно), но никакой каталог?

584
задан 02.06.2018, 15:55

4 ответа

Рекурсивно дать каталоги read&execute полномочия:

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
808
ответ дан 07.12.2019, 07:34

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

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

Значение:

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

Важной вещью отметить вот является тот верхний регистр X действия по-другому к нижнему регистру x. В руководстве мы можем читать:

Выполняться/искать биты, если файл является каталогом или каким-либо из выполняться/искать битов, установлены в исходном (неизмененном) режиме.

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

295
ответ дан 07.12.2019, 07:34

Вы могли использовать следующий сценарий удара в качестве примера. Обязательно дайте ему исполняемые полномочия (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
ответ дан 07.12.2019, 07:34

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

Пример:

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

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

14
ответ дан 07.12.2019, 07:34

Теги

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