Linux 终端中对 800 个文件执行 chmod 444

Linux 终端中对 800 个文件执行 chmod 444

我在一个目录中有将近 800 个文件/storage/。其中有 800 个.dat文件目前处于-rw-rw-r--权限控制状态。我想将所有这些文件更改为只读模式。我尝试过以下方法:

find /storage/ -name "*.dat" | xargs chmod 444

在本地机器上,它对 10 或 20 个文件运行良好。但是当我 ssh 到我的服务器并对这 800 个文件执行相同的命令时,它花了 20 分钟,而且命令仍在运行。

有没有什么具体而快速的方法可以做到这一点? 我的所有文件都不在本地机器上,而是在托管服务器上。

这 800 个文件每个大小为 30Gb。

答案1

关键区别在于搜索时间可能更大/storage。服务器上的此文件夹可能包含大量任何类型的文件,这会增加查找dat此树中的所有文件所需的时间。服务器端/storage也可能很慢。

下一个命令可以让您了解这一点(计算文件和文件夹的数量/storage):

find /storage | wc -l

还要注意,您运行的命令将*.dat首先搜索每个文件,然后chmod第二步仅调用一次所有匹配的名称。

使用 20 个文件名参数进行调用chmod是合理的,但 800 个文件路径参数就有点太多了。您的系统对命令行参数的长度有限制(请参阅xargs --show-limits)。

我建议你直接问find执行命令会中断chmod多个子集中的调用。下一个命令将对chmod每个包含dat文件的文件夹调用一次,这看起来很合理:

find /storage -type f -name '*.dat' -execdir chmod 444 '{}' \+
  • 要为每个匹配的文件派生一个,chmod您需要将其替换\+\;
  • 为了更好地了解进展,您可以添加参数--changes--verbose调用chmod

答案2

您必须调试该问题。使用以下方法生成脚本:

echo '#!/bin/sh' > bigscript.sh
find /storage/ -name "*.dat" | xargs -n 1 echo chmod 444 >> bigscript.sh
chmod u+x bigscript.sh

然后编辑 bigscript 并在几行后面输入调试信息(echo A,,echo B...)并查找错误。

文件的大小并不重要;800 个文件只需很少的时间。

备择方案

简单的替代方法:尝试chmod -v;这会告诉您 chmod 正在做什么。

其他选择:找到正在运行的 chmod 的 PID(-> CHMODPID)并查看ls -l /proc/$CHMODPID/fd

相关内容