如何更改文件夹权限,但不是文件?

有一个简洁的Linux命令(这将在OSX上工作)更改文件夹及其所有内容的权限,但保留当前目录中的文件不变? 例如:

/父/文件夹1 < – 更改权限
/ parent / folder2 <-change权限
/ parent / folder3 <-change权限
/ parent / folder3 / file1 <-change权限
/父/文件夹3 /文件2 < – 改变权限
/ parent / file1 < – 不更改权限
/ parent / file2 < – 不更改权限

你需要运行两个我相信的命令。 这是做到这一点的一种方法:

# find . -mindepth 1 -type d | xargs chmod 700 # find . -mindepth 2 | xargs chmod 700 

第一个目录在当前目录级别和更深。 第二个执行比当前目录更深的所有文件和目录。

这将改变当前目录中的每个目录以及它们中的所有文件和文件夹的权限,我想这就是你想要的,但要小心,因为recursion…

 find . -maxdepth 1 -type d -exec chmod -R 700 {} \; 

你可以使用find或者循环for

 for directory in parent/*; do if [ -d $directory ]; then chmod -R 700 $directory; fi ;done 

有一个小事情, chmod可以自己做到这一点。 如果您设置模式+X (注意,大写,而不是小写),它将只适用于目录。 这通常用于想要使目录树组或全局可读的所有文件的情况。 你会做这样的事情:

 chmod a+rX somedir 

这将为somedir及其下方的所有目录添加读取和执行权限,但只是将权限读取到其下的常规文件。 不幸的是,没有相应的读/写权限模式。

 find . -type d -mindepth 1 -print -exec chmod 755 {}/* \; 

find当前目录(-type d和-mindepth 1)的每个子目录,并为每个find的目录中的所有文件运行chmod。

{}指的是查找目录正在评估,而/*指示chmod只对该目录中的文件进行操作。

以下是一般情况下的一行:

 find /parent -maxdepth 1 -type d -print0 | xargs -0 chmod -R 700 

-print0-0参数使用NUL而不是换行符作为logging分隔符,所以这对于包含空格,换行符等的文件名是安全的。 和-exec不同的是,它将文件名-exec到更less的chmod调用中。

奖金:

如果你知道你没有在/parent级的顶层隐藏目录(比如/parent/.foo ),那就更简单了:

 chmod -R 700 /parent/*/