我在一个目录中有将近 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