Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/unix/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Unix 更改文件而不是目录的chmod_Unix_Grep_Chmod - Fatal编程技术网

Unix 更改文件而不是目录的chmod

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 另一种方法

我需要使用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


另一种方法是使用
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
to
xargs
让它知道应该将其作为输入格式。

使用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