Есть ли способ изменить все права доступа к файлам / каталогам, кроме одного каталога в одной командной строке Linux?
6 ответов
Предполагая, что вы хотите рекурсивно установить бит разрешения 755 для содержимого папок в вашем текущем рабочем каталоге, кроме содержимого папки с именем "nameOfFolderToBeExcluded":
chmod 755 -R $(ls | awk '{if($1 != "nameOfFolderToBeExcluded"){ print $1 }}')
Вы можете использовать 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
файла остались без изменений. То же самое относится и к каталогам.
Какая оболочка?
Если вы используете bash (вероятно, если вы работаете в Linux), вы можете проверить extglob, который дает вам больше возможностей для глобализации, включая "негативный глобус" !()
shopt -s extglob
chmod 774 !(file-to-ignore)
Используя 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" рекурсивно.
Я использую приведенную ниже команду, она выдаст файлы 644 и каталог 755 всем файлам и каталогам в рабочем каталоге Present, но исключит каталог var для предоставления разрешения.
find . -not -path "*/var*" -type f -exec chmod -c 0644 {} \; && find . -not -path "*/var*" -type d -exec chmod -c 0775 {} \;
Еще более простой способ с основными командами:
chmod 755 -R $(ls -A|grep -v 'directory_name_to_exclude/*')