Используя stat
, вы можете получить права доступа к файлу.
Например:
$ touch a
$ stat -c '%a' a
644
Затем, если мы поймаем это значение, мы можем использовать sed
, чтобы 2-е поле имело то же значение, что и 1-е:
$ sed -r "s/^(.)./\1\1/" <<< "644"
664
И тогда мы готовы сказать
chmod 664 file
Теперь, когда у нас есть все части, посмотрим, как их склеить. Идея состоит в том, чтобы поймать первый символ вывода stat
для генерации нового значения:
perm=$(stat -c '%a' file)
new_perm=$(sed -r "s/^(.)./\1\1/" <<< "$perm")
chmod "$new_perm" file
Затем нужно перебрать файлы и сделать следующее:
for file in pattern/*; do
perm=$(stat -c '%a' "$file")
new_perm=$(sed -r "s/^(.)./\1\1/" <<< "$perm")
chmod "$new_perm" "$file"
done
Если вы хотите, чтобы это было связано с результатом find
, как вы указываете в комментариях и обновленном вопросе, вы можете использовать замену процесса:
while IFS= read -r file; do
perm=$(stat -c '%a' "$file")
new_perm=$(sed -r "s/^(.)./\1\1/" <<< "$perm")
chmod "$new_perm" "$file";
done < <(find . -name '*' -print0)
30.11.2015
for
, который может сделать это, если вы находитесь на двух уровнях. В противном случае, и если это содержит больше уровней, вы можете использоватьfind
через замену процесса. 30.11.2015find
, поскольку то, как вы используете его в обновленном вопросе, немного излишне. 30.11.2015