linux - 我将如何 chown grep 找到的所有内容

标签 linux bash shell

我希望对所有包含单词“hi”的文件进行 chown

我现在有

grep -r $1 $2
if [ $? -eq 0 ]; then
        echo "Found text"
        echo $match
        echo "start"

输入为 ./test.sh "hi"*

我能够获取包含 hi 的所有文件,但是当我尝试 chown 时,我不确定要用管道放置什么我知道您可以将变量传递给下一个参数,例如;

grep -r $1 $2 | chown user1:root *

但这似乎只是对整个目录进行操作,这不是我想要的。

关于通过此阅读或调查的内容有什么建议吗?

最佳答案

您正在寻找 xargs 命令。它从标准输入中读取一系列字符串,并将它们转换为指定命令的参数。例如:

grep -r --files-with-matches $1 $2 | xargs chown user1:root

更新:

评论者提出了加强上述命令的技术,这确实是一个好主意。由于 $1$2 是脚本的命令行参数,一般来说,您不能确信它们不包含空格或其他会改变含义的字符命令。因此,引用它们是个好主意。此外,如果任何文件名包含空格——包括包含路径段中的任何目录名——那么除非你帮助它,否则 xargs 将误解结果。下面是一个版本的管道,可以更有效地应对此类问题:

grep -rlZ "$1" "$2" | xargs -0 chown user1:root

此版本依赖于 grepxargs 的 GNU 扩展。 -Z 选项导致 grep 使用零值字符而不是换行符分隔输出“行”,并且 -0 参数to xargs 告诉它相应地解释传入的数据。该字符具有在 Unix 文件名中不允许使用的独特区别。

grep-l 选项(小写 L,不是数字 1)是 GNU 的 --with-file-names< 的缩写形式 选项;任何符合 POSIX 标准的 grep 都支持短格式。为了完整性和简洁性,我在这里展示它。

关于linux - 我将如何 chown grep 找到的所有内容,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35416668/

相关文章:

bash - 在一行 bash 脚本中打印出 5 个字符

linux - 从文件中获取一行并将其附加到另一个文件

bash - 如何 : Detect bash from shell script

linux - 如何将 head 命令的结果添加到文件的第一行?

linux - Coral 开发板 hdmi arc 输入/输出错误

c - 如何在另一个 shell 的上下文中访问一个上下文的 shell 变量

regex - 如何一次 grep 多个模式?

linux - 如何使用 vmstat 有效地监控系统状态?

c++ - 在 Linux 上断言失败后继续调试?

linux - 用于在设备上命名视频的 Shell 脚本