对多个子目录内的 400,000 个文件进行 chmod 操作?

对多个子目录内的 400,000 个文件进行 chmod 操作?

你好...我想对一大堆文件执行 chmod 777。或者,由于更安全,我也可以对这些文件执行 chown www:www 以使它们可以通过网络访问。

现在,由于我有超过 400,000 个文件,sudo chmod -R 777 ./*并且sudo chown -R www:www ./*根本不起作用,只返回“Arg 列表太长”

谷歌搜索后出现了findxargs,但这对我的文件集不太适用,因为有些文件的名称中有下划线。我不确定为什么这会破坏脚本,但确实如此。命令:

find ./ -name "*" | xargs chmod 777

以下是目录树的匿名片段:

files
\- 28934723
   \- file1.xml
   \- file2.txt
\- 34905834
   \- file1.xml
   \- file2.txt
\- 21398230
   \- file1.xml
   \- file2.txt

据我所知man find,它应该会自动递归到子目录中,但我不确定。当我运行上述命令时,一些文件发生了变化,但大多数目录保持不变(相同的权限)。

提前感谢你们提供的任何帮助:)

答案1

sudo chown -R www:www ./如果您不想要 www 拥有的目录,只需将其改回来。

答案2

我不明白为什么以下命令行无法工作:

find . -print0 |xargs -0 chmod 777

或者更简单一点,chmod 777 -R .

答案3

如果可以的话,请尝试限制权限。如果您尝试授予对 www 的完全访问权限,并且您使用的是具有 acl 的 redhat 系统(可能需要重新挂载),请尝试:
setfacl -R -m user:www:rwx the_parent_directory
setfacl -d -R -m user:www:rwx the_parent_directory并在必要时用组替换用户,重复此操作。

如果您的参数列表太长并且不能使用完整目录,那么这将起作用(但会更慢):
find . -type d -exec setfacl -d -R -m user:www:rwx '{}'; setfacl -R -m user:www:rwx '{}' \;
如果其中还有未被目录覆盖的文件,则需要对这些文件再次运行它(我相信有人会告诉我切换到 setfacl 只执行顶级目录):
find . -type f -exec setfacl -m user:www:rwx '{}' \;
您也可以使用相同的方法执行 777(类似于 xargs,但我更喜欢这种方式,看起来更干净:
find . -exec chmod 777 '{}' \;至于下划线,它应该不是问题(它们可能是由管道或某些东西解释的),但如果它们是:
find . -name \*_\* -exec chmod 777 '{}' \;

相关内容