Как обрабатывать имена файлов с пробелами при изменении прав доступа к определенным файлам в текущем каталоге и всех его подкаталогах?

Как обрабатывать имена файлов с пробелами при изменении прав доступа к определенным файлам в текущем каталоге и всех его подкаталогах?

В настоящее время я пытаюсь сделать все файлы с расширениями .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.)

Здесь используется рекурсивная подстановка оболочки и операторы Dand. квалификаторы 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», когда это будет для вас удобно.

Связанный контент