Как chmod 755 все каталоги, но нет файла (рекурсивно)?
И наоборот, как chmod только файлы (рекурсивно), но без каталога?
permissions
chmod
Оливье Лалонд
источник
источник
Ответы:
Чтобы рекурсивно дать каталогам права на чтение и выполнение:
Чтобы рекурсивно дать файлам права на чтение:
Или, если есть много объектов для обработки:
Или, чтобы уменьшить
chmod
нерест:источник
-bash: /bin/chmod: Argument list too long
. Последняя команда работает со многими файлами, но при ее использованииsudo
нужно быть осторожнее, чтобы поместить ее перед xargs вместо chmod: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
примере с nik :Смысл:
-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 не удаляет флаг выполнения из файлов, у которых он уже есть.
Пример:
Обновление: кажется, что это не удалось, потому что первое изменение (ugo-x) делает каталог неисполнимым, поэтому все файлы под ним не изменяются.
источник
chmod -R ugo-x path
, это может быть проблемой. Но полная команда выполнит все действия вchmod u+rwX
каждом каталоге, прежде чем попытаться спуститься в него.) Однако я считаю, что этогоchmod R u=rw,go=r,a+X path
достаточно - и оно короче.Я решил написать небольшой сценарий для этого сам.
Рекурсивный скрипт chmod для директорий и / или файлов - Gist :
chmodr.sh
Он в основном делает рекурсивный chmod, но также обеспечивает некоторую гибкость для параметров командной строки (устанавливает права доступа к каталогу и / или файлу или исключает оба, он автоматически сбрасывает все до 755-644). Он также проверяет несколько сценариев ошибок.
Я также написал об этом в своем блоге .
источник
Чтобы рекурсивно дать каталогам права на чтение и выполнение:
Чтобы рекурсивно дать файлам права на чтение:
Лучше поздно, чем никогда, позвольте мне обновить ответ Ника на правильность. Мое решение медленнее, но оно работает с любым количеством файлов, с любыми символами в именах файлов, и вы можете запустить его с помощью sudo в обычном режиме (но помните, что он может обнаружить другие файлы с помощью sudo).
источник
Попробуйте этот скрипт на Python; он не требует порождения процессов и выполняет только два системных вызова на файл. Помимо реализации в C, это, вероятно, будет самый быстрый способ сделать это (мне нужно было исправить файловую систему из 15 миллионов файлов, все из которых были настроены на 777)
В моем случае попытка / отлов потребовалась для последнего chmod, так как chmodding некоторых специальных файлов не удался.
источник
Вы также можете использовать
tree
:и если вы хотите также просмотреть папку, добавьте эхо
источник
xargs
проблемах. Одиночные кавычки в именах файлов сами по себе являются проблемой для многих команд и сценариев, поэтому я перечислил все файлы, содержащие одинарные кавычки, и удалил их (я имею в виду кавычки)Вы можете использовать следующий скрипт bash в качестве примера. Обязательно дайте ему исполняемые разрешения (755). Просто используйте ./autochmod.sh для текущего каталога или ./autochmod.sh <dir>, чтобы указать другой.
источник
$1
не равно нулю, но не является именем каталога (например, является опечаткой), тоdir
устанавливается значение.
без сообщения. (2)$1
должно быть"$1"
и$dir
должно быть"$dir"
. (3) Вам не нужно говорить"./"
;"."
хорошо (и, строго говоря, здесь вам не нужны кавычки). (4) Это не рекурсивное решение. (5) В моей системеls -l … | awk '{ print $8 }'
получает время модификации файлов. Вам нужно{ print $9 }
получить первое слово в имени файла. И даже тогда (6) это не обрабатывает имена файлов с пробелами. …chmod
сам перейдет к 644, что сделает его неисполняемым!