UNIX-更改文件而不是目录的chmod
我需要使用chmod将所有文件递归更改为664。我想跳过这些文件夹。我当时想做这样的事情
ls -lR | grep ^-r | chmod 664
我猜这是行不通的,因为我无法通过管道插入chmod有人知道这样做的简单方法吗?
谢谢
一个-print0
答案是一个很好的答案,但它通常具有不相关的缺点,即为每个文件创建一个单独的子过程。 但是,它的功能非常完善,并且仅在文件数量非常大时才会表现不佳。 使用find
将文件名分成大组,然后为该组文件运行子进程。
您只需要注意,在使用-print0
时,您可以正确处理包含嵌入式空格,换行符或其他特殊字符的文件名。
解决这两个问题的解决方案是(假设您有足够好的-print0
和find
实现):
find . -type f -print0 | xargs -0 chmod 644
-print0
导致find
以NUL字符(而不是空格)终止其输出流上的文件名,并且-0
至xargs
告知它应将其作为输入格式。
执行此操作的另一种方法是使用-exec
,如下所示:
find . -type f -exec chmod 644 {} \;
问题是-exec
为每个文件启动了chmod
进程。 xargs
方法可以避免这种情况,并且如果您具有可以解决“路径名中的空格”问题的find
和xargs
的版本,则它是高级的。 查看已接受的答案。
记录下来,如果要修改的文件太多或路径名的总长度太大,则使用反引号将中断。
我简洁的两分钱...
Linux的:
$ chmod 644 `find -type f`
OSX:
$ chmod 644 `find . -type f`
这可以递归地更改当前目录及其所有子目录中包含的所有文件。 如果要定位到其他目录,请用正确的路径替换.
:
$ chmod 644 `find /home/my/special/folder -type f`
通过[http://www.linuxquestions.org/questions/aix-43/chmod-recursion-files-only-208798/?s=a70210fb5e5d0aa7d3c69d8e8e64e3ed]
“找到。-type f -print | xargs chmod 444”应该工作,不是吗? 如果不是,请查找。 -print> myfile.sh 和vi myfile.sh删除目录(它们不应太多),然后 1,$ s / ^ / chmod 444 / 并关闭myfile.sh。
用GNU查找
find /path -type f -exec chmod 644 {} +;