7

Есть ли способ изменить все права доступа к файлам / каталогам, кроме одного каталога в одной командной строке Linux?

6 ответов6

5

Предполагая, что вы хотите рекурсивно установить бит разрешения 755 для содержимого папок в вашем текущем рабочем каталоге, кроме содержимого папки с именем "nameOfFolderToBeExcluded":

 chmod 755 -R $(ls | awk '{if($1 != "nameOfFolderToBeExcluded"){ print $1 }}')
4

Вы можете использовать find для поиска всех файлов, которые не соответствуют заданному имени файла, и exec команду для всех таких файлов, найденных как:

Предполагая, что вам нужно исключить test каталога и дать права доступа к файлу 755 всем остальным файлам и директорам. Это будет вырезано из верхней части дерева.

find ! -name test -exec chmod 755 {} \;

проверенный

mtk@mtk4-laptop:$ touch a1.txt a2.txt a3.txt test
mtk@mtk4-laptop:$ ls -lrt
total 0
-rw-rw-r-- 1 mtk mtk 0 Sep 17 23:55 test
-rw-rw-r-- 1 mtk mtk 0 Sep 17 23:55 a3.txt
-rw-rw-r-- 1 mtk mtk 0 Sep 17 23:55 a2.txt
-rw-rw-r-- 1 mtk mtk 0 Sep 17 23:55 a1.txt
mtk@mtk4-laptop:$ find ! -name test -exec chmod 777 {} \;
mtk@mtk4-laptop:$ ls -lrt
total 0
-rw-rw-r-- 1 mtk mtk 0 Sep 17 23:55 test
-rwxrwxrwx 1 mtk mtk 0 Sep 17 23:55 a3.txt*
-rwxrwxrwx 1 mtk mtk 0 Sep 17 23:55 a2.txt*
-rwxrwxrwx 1 mtk mtk 0 Sep 17 23:55 a1.txt*
mtk@mtk4-laptop:$ 

Разрешения на файл для test файла остались без изменений. То же самое относится и к каталогам.

2

Какая оболочка?

Если вы используете bash (вероятно, если вы работаете в Linux), вы можете проверить extglob, который дает вам больше возможностей для глобализации, включая "негативный глобус" !()

shopt -s extglob
chmod 774 !(file-to-ignore)
1

Используя find проще так:

find <from_where_to_change> -not -path "*/<excluded_dir_name>*" [-and -not -path "*/<another_excluded_dir_if_you_want>*"] -exec chown <user>[:<group>] {} \;

В моем случае это было:

find /data/project -not -path "*/.svn*" -exec chown :www-data {} \;

Таким образом я рекурсивно изменил группу в папке /data /project, за исключением всех папок ".svn" рекурсивно.

0

Я использую приведенную ниже команду, она выдаст файлы 644 и каталог 755 всем файлам и каталогам в рабочем каталоге Present, но исключит каталог var для предоставления разрешения.

find . -not -path "*/var*" -type f -exec chmod -c 0644 {} \; && find . -not -path "*/var*" -type d -exec chmod -c 0775 {} \;
0

Еще более простой способ с основными командами:

chmod 755 -R $(ls -A|grep -v 'directory_name_to_exclude/*')

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .