Unix 更改文件而不是目录的chmod
我需要使用chmod将所有文件递归更改为664。我想跳过文件夹。 我在考虑做这样的事情Unix 更改文件而不是目录的chmod,unix,grep,chmod,Unix,Grep,Chmod,我需要使用chmod将所有文件递归更改为664。我想跳过文件夹。 我在考虑做这样的事情 ls -lR | grep ^-r | chmod 664 这不起作用,我假设是因为我无法通过管道进入chmod 有人知道一个简单的方法吗 谢谢通过 “查找-键入f-print | xargs chmod 444”应该有用,不是吗? 如果没有,请查找-打印>myfile.sh 和vi myfile.sh删除目录(它们不应该太多),然后 1$s/^/chmod 444/ 和sh myfile.sh 另一种方法
ls -lR | grep ^-r | chmod 664
这不起作用,我假设是因为我无法通过管道进入chmod
有人知道一个简单的方法吗
谢谢通过
“查找-键入f-print | xargs chmod 444”应该有用,不是吗?
如果没有,请查找-打印>myfile.sh
和vi myfile.sh删除目录(它们不应该太多),然后
1$s/^/chmod 444/
和sh myfile.sh
另一种方法是使用
find-执行…
如下所示:
find . -type f -exec chmod 644 {} \;
问题是,-exec
为每个效率低下的文件启动chmod
进程。避免这种情况的解决方案是:
find . -type f -exec chmod 644 {} +
这将在chmod
processs命令行上组合尽可能多的文件名参数。find…|xargs…
方法类似;见公认的答案
对于记录来说,如果有太多的文件要进行chmoded,或者路径名的聚合长度太大,那么使用反勾号将会中断。一个
find-exec
答案是一个不错的答案,但它有一个通常不相关的缺点,即它为每个文件创建一个单独的子进程。但是,它的功能非常完善,只有当文件数量非常大时,它的性能才会很差。使用xargs
将文件名批处理为大组,然后再为该组文件运行子进程
您只需小心,在使用xargs
时,您可以正确处理文件名,其中嵌入空格、换行符或其他特殊字符
解决这两个问题的解决方案是(假设您有足够好的find
和xargs
实现):
-print0
使find
以NUL字符(而不是空格)终止其输出流上的文件名,而-0
toxargs
让它知道应该将其作为输入格式。使用GNU find
find/path-type f-execchmod644{}+代码>我简洁的两分钱
Linux:
$chmod 644`查找-类型f`
OSX:
$chmod 644`查找-f型`
这可以递归地更改当前目录及其所有子目录中包含的所有文件。如果要针对不同的目录,请用正确的路径替换
:
$chmod 644`find/home/my/special/folder-类型f`
这应该在ServerFaultchmod中提出,它本身应该能够区分文件、链接和文件夹。这对于GNU find非常有用,但不幸的是-print0和xargs-0不是标准的,例如在Solaris上不起作用。因此,在这种情况下,请使用其他解决方案之一。我可以确认此方法在Mac OSX上有效(至少10.9)。@mark4o,您不局限于使用Solaris附带的死板版本。自由/开源软件的一大优点是,您可以将其移植到任何足够近的(UNIXy)操作系统。我经常在AIX per-version-5L上这样做。如果您的意思是对chmod
有太多的参数,那不是问题xargs
智能地对文件进行批处理。@codeforester,xargs
已经对文件进行批处理,以便它们不会超过参数长度限制。-n/-L
选项只允许对批大小进行进一步的任意限制。如何指定哪个目录?我最初的回答涵盖了OP提出的问题:递归更改当前目录中的所有文件。请参阅我的编辑,了解如何将此应用于任何目录,而不仅仅是当前目录。感谢您提供最简单和最短的解决方案。对于带空格的名称(Mac OS+Bash),我的解决方案失败。
find . -type f -print0 | xargs -0 chmod 644