
В настоящее время я пытаюсь сделать все файлы с расширениями .html
в текущем каталоге и всех его подкаталогах доступными для чтения и записи , а также для исполнения их владельцем и доступными только для чтения (не для записи или исполнения) группами и другими. Однако в именах некоторых файлов есть пробелы, и я не уверен, как с этим бороться.
Моя первая попытка:
chmod -Rv u+rw,go+r '* *.html'
При первой попытке я получил следующее сообщение:
chmod: cannot access '* *.html': No such file or directory
failed to change mode of '* *.html' from 0000 (---------) to 0000 (---------)
Моя вторая попытка:
find . -type f -name "* *.html" | chmod -Rv u+rw,go+r
Я добавил оператор конвейера, чтобы отправить find
вывод команды в chmod
. Однако, когда я попробовал сделать вторую попытку, я получил следующее:
chmod: missing operand after ‘u+rw,go+r’
После моих попыток я все еще не понимаю, как обращаться с пробелами в именах файлов, чтобы рекурсивно изменять установленные разрешения. Каков наилучший способ решения этой проблемы? Любые отзывы или предложения приветствуются.
решение1
Используйте -exec
предикат find
:
find . -name '* *.html' -type f -exec chmod -v u+rw,go+r {} +
(здесь добавление rw-r--r--
только разрешений, так как нет смысла добавлять разрешения на выполнение к html-файлу, поскольку они, как правило, не предназначены для выполнения. Замените +
на =
toнаборэти разрешения именно вместодобавлениеэти биты к текущим разрешениям).
Вы также можете добавить ! -perm -u=rw,go=r
перед , -exec
чтобы пропустить файлы, которые уже имеют (по крайней мере) эти разрешения.
Сsfind
реализацияfind
(который также является find
встроеннымоболочкаbosh
), можно использовать -chmod
предикат, за которым следует -chfile
(который применяет изменения):
sfind . -name '* *.html' -type f -chmod u+rw,go+r -chfile
(там нет необходимости добавлять ! -perm...
as , sfind
так как -chfile
файлы, которые уже имеют нужные разрешения, пропускаются).
Этот вариант наиболее эффективен, поскольку не требует выполнения отдельной chmod
команды в новом процессе для каждого определенного количества файлов, а также избегает повторного поиска полного пути к каждому файлу ( sfind
вызывает chmod()
системный вызов с путями к файлам относительно каталогов, sfind
находит их во время сканирования, что означает, chmod()
что не нужно снова искать все компоненты путей, ведущие к ним).
С zsh
:
chmod -v -- u+rw,go+r **/*' '*.html(D.)
Здесь используется рекурсивная подстановка оболочки и операторы D
and.
квалификаторы globсоответственно включить скрытые файлы и ограничитьобычныйфайлы (как -type f
делает). Добавить, ^f[u+rw,go+r]
чтобы также пропустить файлы, которые уже имеют эти разрешения.
Вы не можете использовать chmod
' -R
для этого в сочетании с подстановками. Подстановки расширяются оболочкой, а не сопоставляются с chmod
, поэтому с chmod -Rv ... *' '*.html
(обратите внимание, что их *
нужно оставить без кавычек, чтобы оболочка интерпретировала их как операторы подстановки), вы просто передадите список файлов, html
и chmod
только если какие-либо из этих файлов являются каталогами, chmod рекурсивно перейдет в них и изменит разрешения всех файлов в них.
решение2
«Имена файлов с пробелами» требуют find
и xargs
. Прочитайте man find xargs
и сделайте что-то вроде:
find . -type f -name '*.html' -print0 | \
xargs -0 -r echo chmod u=rwx,g=r,o
Удалите « echo
», когда это будет для вас удобно.