尝试将包含字符“DATA”的文件夹中的所有文件的权限设置为读写?洛基Linux

尝试将包含字符“DATA”的文件夹中的所有文件的权限设置为读写?洛基Linux

我正在尝试将权限更改为仅读取和写入特定文件夹中的所有文件,但该文件中必须包含字符串“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

使用-lgrep l列出包含至少一行与正则表达式匹配的文件。使用-Z(也是 GNU 扩展),它打印以 NUL 分隔的文件路径,以便可以对输出进行后处理。

xargs -0² 拆分 NUL 上的输出以通过作为单独的参数chmod公用事业。对于-r²,如果其输入为空(未报告任何文件路径),则根本xargs不会运行。chmodgrep

要跳过已经具有权限的文件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(或者如果./dirin./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 option ),并且/dev/stdin在 Linux 上是一个指向打开的文件的神奇符号链接,/dev/stdin即使该文件已被删除或重命名,也应保证指向打开的实际文件。


一些其他的grep现在也支持,-r但很少允许省略目录,.在最新版本的 GNU 中,grep-r/-R也被使用时,默认为目录。

²-r也是-0GNU 扩展,但它们现在在其他实现中广泛使用,甚至会出现在 POSIX 标准的下一版本中。

相关内容