更改当前目录及其所有子目录中某些文件的权限时,如何处理带空格的文件名?

更改当前目录及其所有子目录中某些文件的权限时,如何处理带空格的文件名?

我目前正在尝试将.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 文件添加执行权限没有什么意义,因为这些权限通常不意味着被执行。替换+=这些权限完全代替添加这些位到当前权限)。

您还可以! -perm -u=rw,go=r在 之前添加 来-exec跳过已经(至少)具有这些权限的文件。

随着sfind实施find(这也是find内置的贝壳bosh),您可以使用-chmod后跟的谓词-chfile(应用更改):

sfind . -name '* *.html' -type f -chmod u+rw,go+r -chfile

(在那里,不需要添加! -perm...assfind已经-chfile跳过已经具有正确权限的文件)。

这是最有效的,因为它不涉及chmod 在新进程中为每个文件执行单独的命令,而且还因为它避免了两次查找每个文件的完整路径(使用文件的路径调用系统调用sfindchmod()相对于目录sfind 在爬行期间找到它们,这意味着chmod()不需要再次查找通向它们的所有路径组件)。

zsh

chmod -v -- u+rw,go+r **/*' '*.html(D.)

这里使用 shell 的递归通配符和Dand. 全局限定符分别包含隐藏文件并限制为常规的文件(就像-type f那样)。添加^f[u+rw,go+r]也可以跳过已经具有这些权限的文件。

您不能将chmods-R与 glob 结合使用。通配符由 shell 扩展,不与 匹配chmod,因此chmod -Rv ... *' '*.html(请注意,*必须不加引号,shell 才能将它们解释为通配符运算符),您只需将html文件列表传递给chmod且 仅当其中任何文件是目录将 chmod 递归到其中并更改其中所有文件的权限。

答案2

“带空格的文件名”需要findxargs。阅读man find xargs,并执行以下操作:

find . -type f -name '*.html' -print0 | \
    xargs -0 -r echo chmod u=rwx,g=r,o

echo当它对你有用时删除“ ”。

相关内容