我有一个存储在文件中的文件列表,我想对每个文件进行 grep 查找搜索词。
但是,xargs
将参数作为单引号字符串转发,因此对于所有以 为前缀的文件~
,我都会收到No such file or directory
错误,因为~
' 未扩展。
这是我正在运行的命令:cat search-files | xargs -n 1 grep 'search-term'
search-files
除了自己实际进入并更改路径之外,我怎样才能解决这个问题?
答案1
但是您可能会遇到其他问题:如果搜索文件包含行*
or该怎么办$(rm important-file)
?
扩展@steeldriver的提示:
sed "s,^~,$HOME," search-files | xargs -n 1 grep 'search-term'
答案2
好吧,我想通了A解决方案,但我不太确定它为什么有效。
如果插入xargs -i sh -c 'echo {}'
,波形符会扩展。
整个命令如下所示:
cat search-files | xargs -i sh -c 'echo {}' | xargs -n 1 grep 'search-term'
编辑:好的,这就是它的工作原理: 当执行命令时,用单引号xargs
将每个[command]
和括起来。[initial-args]
所以,与原来的命令一样,grep
和{}
被单独单引号括起来。然而,通过做sh -c 'echo {}'
,我们力echo
和{}
成一样[initial-arg]
。这允许sh
正常地进行波形扩展。如果我们没有单引号'echo {}'
,这将不起作用。