bash循环以更改权限

bash循环以更改权限,bash,Bash,我正在尝试更改~/Documents文件夹中文件的所有权限,我认为下面的小循环会起作用,但似乎不起作用。有人能帮我吗?以下是循环: files=~/Documents/* for $file in $files { chmod 755 $file } 我试图将其直接写入bash命令行,但出现以下错误: -bash: syntax error near unexpected token `chmod' 感谢您的帮助/建议循环应该是: for file in $files do te

我正在尝试更改~/Documents文件夹中文件的所有权限,我认为下面的小循环会起作用,但似乎不起作用。有人能帮我吗?以下是循环:

files=~/Documents/*
for $file in $files {
   chmod 755 $file }
我试图将其直接写入bash命令行,但出现以下错误:

-bash: syntax error near unexpected token `chmod'
感谢您的帮助/建议

循环应该是:

for file in $files
do
   test -f "$file" && chmod 755 "$file"
done  
请注意,当您说
files=~/Documents/*
时,您依赖的是它也将包括
~/Documents
下的目录,因此使用循环也将更改目录的权限。您可以添加一个简单的测试,以确保只更新文件的权限。另外请注意,可以使用
set-f
关闭globbing,在这种情况下
文件
的值仅为
/*
,可能不是文件名;这也不符合你的目的

更重要的是,正如在文章中所指出的,依靠它不是一个好主意。当您使用全局绑定时,带有hypens的文件名可能具有未定义的行为&带有分号的文件名可能会导致安全漏洞。除了与全局绑定相关的安全漏洞外,还与全局绑定相关。请看一看,其中突出了您当前运营中涉及的一些风险

您也可以使用
find
(这将对所有文件进行递归设置):
find~/Documents/-type f-exec chmod 755{}
要仅为
~/Documents/
下的文件设置权限,可以使用
-maxdepth
选项:
find~/Documents/-maxdepth 1-type f-exec chmod 755{}

希望这有帮助

试试看

find . -exec chmod 755 {} +\;

为什么不:

chmod -R 755 ~/Documents

使文档可执行存在风险。除非你知道,否则我建议你不要这样做 正是你在做的

我将大胆猜测,您并不是真的想让所有文档文件夹都可执行,而您真正想做的是对该文件夹中的所有内容的用户可写其他人可读权限进行标准化

请注意(正如有人在另一个答案中提到的,
chmod
命令有自己的“递归”选项,
-R
。另外请注意,您可以对chmod使用“符号”权限,而不仅仅是octall。因此:

chmod -R go+r-wx ~/Documents/
将在
~/Documents/
下的所有内容中添加读取、删除写入和执行函数

请注意,这将使子目录可读,但不会提供对其中文件的访问(因为目录上的可执行位就是这样做的)。因此,您可能需要使用两个命令:

find ~/Documents/ -type d -exec chmod 755 {} \;
find ~/Documents/ -type f -exec chmod 644 {} \;


第一行仅在目录上运行
chmod
,使它们既可读又可访问。第二行只影响您的文件,使其可读。

这不是bash语法。将您的shell与您决定使用的语法相匹配(tcsh?),或者将您的程序的语法与shell相匹配(您将找到大量bash脚本教程)。为什么要使所有文档都可执行?
-OP的查询可能需要f类型他也没有指出他是否希望它是递归的我确实希望是递归的--我应该添加什么
chmod 755-r$file
?@jordan,我假设
all
意味着
all
,因此是递归的。@杰夫,不,它已经设置为递归的。我会为每个cowards的建议再举一个例子。效果很好——只是我知道我写的东西不适用于带空格的文件名。有没有办法在bash中逃离空间?在运行
chmod 755$file
之前执行类似于
escape($file)
的操作?为什么只使用sudo chmod-R 755~/Documents/?对不起,但是-1没有指出OP不应该依赖变量赋值中的fileglobbing。以连字符开头的文件名可能导致不可预知的行为。带有分号的文件名可能是一个安全漏洞。如果文件名中有空格,引用
$file
将不会有帮助,因为
$files
已在空格上拆分。您需要使用一个数组:
files=(~/Documents/*);对于“${files[@]}”中的文件;执行…
或完全跳过存储列表:
用于~/Documents/*中的文件;做…
@GordonDavisson-我不认为这是迭代中的单词分割,因为glob实际上在for循环中才被扩展,所以它本质上与~/Documents/*
中的文件的
相同,尽管这肯定不是我会采取的方法。这看起来很简单。然而,我认为-R应该在755之前出现。当我按照您当前列出的顺序执行时,它不起作用。它可以与coreutils的
chmod
一起使用,但我会将其更改为更兼容。这使他的所有文档都可以执行。@Graham:755是OP要求的。@Thor-不,755只是在他的示例中。他要求的是帮助和建议。你也可以使用符号权限
go=rX
设置目录上的执行,但不设置文件上的执行(已具有执行权限的文件除外,其中假定执行是有意的并保留它…)谢谢,Gordon。我总是忘记那件事。:-)
find ~/Documents/ -type d -exec chmod 755 {} \;
find ~/Documents/ -type f -exec chmod 644 {} \;