Как выполнить команду chmod только для подкаталогов?

Этот сработал для меня

$ echo `grep -oe '^...\|[0-9]\{5\}' filename` | grep -oe '.\{9,10\}$\?' | grep ed
Ted 30000 
Ned 25000
7
18.03.2018, 09:50
4 ответа

В каталоге верхнего уровня можно использовать подстановочные знаки.

chmod 774 d*/workspace

Или, чтобы сделать это более конкретным, вы также можете ограничить подстановочный знак, например, до d, за которым следует одна цифра.

chmod 774 d[0-9]/workspace

Более общий подход может заключаться в find.

find d* -maxdepth 1 -name workspace -type d -exec chmod 774 "{}" \;
17
27.01.2020, 20:14

В такой оболочке, как bash, вы можете использовать расширенную опцию подстановки, чтобы сначала пометить все каталоги с именами workspaceи chmodза один раз

shopt -s nullglob globstar

Опция nullglobпредназначена для того, чтобы убедиться, что расширение glob не выдает никаких ошибок, когда оно не не находит никаких файлов в пути. Также это гарантирует, что пустая строка glob не будет включена в массив. Опция globstarвключена для рекурсивной подстановки.

Теперь пометьте эти каталоги в массиве оболочки как

dirs=(**/workspace/)

В качестве еще одной проверки работоспособности вы можете сначала распечатать массив, чтобы убедиться, что все требуемые каталоги позаботились. Посмотрите, все ли каталоги перечислены ниже, когда вы выполните приведенную ниже команду printf(),

printf '%s\n' "${dirs[@]}"

Это заполнит массив всеми рекурсивными workspaceпапками, теперь нам нужно использовать chmodдля него

(( "${#dirs[@]}" )) && chmod -R 774 -- "${dirs[@]}"
4
27.01.2020, 20:14

Команда chmodимеет удобный ярлык для установки исполняемого бита только в каталогах, например:

chmod a+X *

Это очень удобно для того, чтобы сделать целое дерево каталогов доступным для чтения всем, но не устанавливать исполняемый бит для каких-либо обычных файлов:

chmod -R a+rX *
3
27.01.2020, 20:14
find. -mindepth 1 -type d -exec chmod 774 {} \;
0
27.01.2020, 20:14

Теги

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