我需要使用 chmod 来递归地将所有文件更改为664。我想跳过这些文件夹。 我想做这样的事
ls -lR | grep ^-r | chmod 664
我猜这没用,因为我无法接入 chmod 有人知道一个简单的方法吗?
谢谢
通过 http://www.linuxquestions.org/questions/aix-43/chmod-recursion-files-only-208798/?s=a70210fb5e5d0aa7d3c69d8e8e64e3ed
“ find.-type f-print | xargs chmod 444”应该可以吧? 如果没有,查找。-print > myfile.sh 和 vi myfile.sh 删除目录(它们不应该太多) ,然后 1,$s/^/chmod 444/ 还有我的档案。
另一种方法是使用 find ... -exec ...,如下所示:
find ... -exec ...
find . -type f -exec chmod 644 {} \;
问题是 -exec为每个效率低下的文件启动一个 chmod进程。避免这种情况的解决办法是:
-exec
chmod
find . -type f -exec chmod 644 {} +
这样可以在 chmod进程命令行上组装尽可能多的文件名参数。find ... | xargs ...方法类似; 请参阅已接受的答案。
find ... | xargs ...
对于记录,如果有太多的文件需要 chmoded,或者路径名的聚合长度太大,使用反勾号将会中断。
find -exec是一个很好的答案,但它存在一个通常不相关的缺点,即它为每个文件创建了一个单独的子进程。然而,它的功能是完美的,只有当文件的数量得到 真的大时才会表现不佳。使用 xargs将在运行该 小组文件的子进程之前将文件名批处理为大组。
find -exec
xargs
您只需要注意,在使用 xargs时,您需要正确处理包含嵌入空格、换行或其他特殊字符的文件名。
解决这两个问题的解决方案是(假设您有一个足够好的 find和 xargs实现) :
find
find . -type f -print0 | xargs -0 chmod 644
-print0使得 find以 NUL 字符(而不是空格)终止其输出流上的文件名,而 -0到 xargs让它知道它应该以这种格式作为输入格式。
-print0
-0
GNU 的搜索结果
find /path -type f -exec chmod 644 {} +;
我简洁的两点建议是..。
Linux:
$ chmod 644 `find -type f`
OSX:
$ chmod 644 `find . -type f`
这样可以递归地更改工作目录及其所有子目录中包含的所有文件。如果您希望以不同的目录为目标,请用正确的路径替换 .:
.
$ chmod 644 `find /home/my/special/folder -type f`