我正在尝试将权限更改为仅读取和写入特定文件夹中的所有文件,但该文件中必须包含字符串“DATA”。
我尝试使用这个命令,但我不确定如何过滤它,我应该使用 grep 吗?
grep -nr DATA | chmod u=rw,g=rw,o=rw *
答案1
正如我在对您现已删除的问题的评论中所说堆栈溢出:
grep -rl DATA "foldername" | xargs -n1 chmod =rw
...警告:如果文件名中有空格,这将不起作用。
我强烈建议您阅读大量 linux/unix 工具链教程,并在参与现实生活之前弄清楚工具如何协同工作。
您的调用会改变一切,但由于chmod
默认情况下不会输出任何内容,因此您grep
会输出任何内容没有什么。
你到底是什么需要正如我的示例所示,要做的就是找到其中的文件DATA
,并修改它们的权限。
答案2
chmod
如果文件包含字符串“DATA”,则可以递归地查找目录中的每个文件并运行。
烫发.sh:
#!/bin/bash
grep -w "DATA" "$1" && chmod 666 "$1"
用于find
递归搜索常规文件(感谢史蒂芬)
find <path/of/folder> -type f -exec bash </path/of/perm.sh> {} \;
答案3
由于您已经在使用 的 GNU-r
扩展grep
,您可以这样做:
grep -rlZ DATA . | xargs -r0 chmod a=rw
使用-l
,grep
l
列出包含至少一行与正则表达式匹配的文件。使用-Z
(也是 GNU 扩展),它打印以 NUL 分隔的文件路径,以便可以对输出进行后处理。
xargs -0
² 拆分 NUL 上的输出以通过作为单独的参数到chmod
公用事业。对于-r
²,如果其输入为空(未报告任何文件路径),则根本xargs
不会运行。chmod
grep
要跳过已经具有权限的文件rw-rw-rw-
:
find . -type f ! -perm a=rw -exec grep -lZ DATA {} + |
xargs -r0 chmod a=rw
便携地,你可以这样做:
find . -type f \
! -perm a=rw \
-exec grep -q DATA {} ';' \
-exec chmod a=rw {} +
但由于grep
每个文件运行一个,效率会大大降低。
无论如何,拥有世界上可写的数据文件听起来是一个非常糟糕的主意。
另请注意,chmod
在更改文件的权限时遵循符号链接,因此,如果文件从常规文件更改为符号链接 to/etc/shadow
或 您~/.bashrc
(或者如果./dir
in./dir/shadow
更改为符号链接 to /etc
),则在这段时间之间find
会找到文件并chmod
运行,您最终可能会更改错误文件的权限。
因此,您不想在世界可写目录中运行这些命令。
如果在可用的 GNU/Linux 系统上zsh
,可以通过以下方式避免这些问题:
find . -type f ! -perm a=rw -execdir zsh -c '
zmodload zsh/system || exit
for file do
sysopen -o nofollow -u0 -- $file &&
grep -q DATA &&
chmod a=rw /dev/stdin
done' {} +
在下降目录树时, Wherefind
将注意不遵循符号链接,并且使用-execdir
命令(此处zsh
)从包含找到的文件的目录中运行。zsh
负责打开文件而不遵循符号链接(nofollow
o
ption ),并且/dev/stdin
在 Linux 上是一个指向打开的文件的神奇符号链接,/dev/stdin
即使该文件已被删除或重命名,也应保证指向打开的实际文件。
一些其他的grep
现在也支持,-r
但很少允许省略目录,.
在最新版本的 GNU 中,grep
当-r
/-R
也被使用时,默认为目录。
²-r
也是-0
GNU 扩展,但它们现在在其他实现中广泛使用,甚至会出现在 POSIX 标准的下一版本中。