我希望对所有包含单词“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
此版本依赖于 grep
和 xargs
的 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/