Мне нужно изменить chmod файлы, которые находятся в определенной группе. Я придумал эту конструкцию:
find . -group groupname -exec sh -c 'su -c "chmod -R u+w,g-w,o-w,g+r,o+r ." - groupname {}' \;
Это работает, но не работает, когда в имени файла есть скобка (или).
Есть идеи?
Вы должны установить для переменной IFS
значение $ (echo -en "\ n \ b")
, например:
#!/bin/bash
SAVEIFS=$IFS
IFS=$(echo -en "\n\b")
find . -group groupname -exec sh -c 'su -c "chmod -R u+w,g-w,o-w,g+r,o+r ." - groupname {}' \;
IFS=$SAVEIFS
Как вы » При использовании интерполяции {}
имя файла остается без кавычек, поэтому это немного похоже на запуск chmod u = rw some (filename) .txt
, который завершится ошибкой, как вы описали .
Одно из решений - переместить {}
из строки в кавычках, чтобы find
мог правильно обработать его самостоятельно.
Другая проблема заключается в том, что вы, кажется, разделяете команду chmod
, причем часть ее находится внутри su
, а часть - снаружи. (Продемонстрируйте это, заменив sh
на echo
.) Результатом является неработающая команда, и я не совсем уверен, чего вы пытаетесь достичь.
Попробуйте это (удалите echo
, когда вы уверены, что он делает то, что вы хотите):
su -c "
find . -group groupname -exec echo chmod -R u+w,go+r,go-w {} \;
"
Вы действительно собираетесь применить рекурсивный chmod
к каждому каталогу, который происходит иметь группу имя группы
? Возможно, вам следует рассмотреть -тип d
в наборе предикатов.