使用 bash 命令搜索文件时find
,我想将结果文件连接成一个新文件。例如,如果 find 命令得出:
find . -name "configuration_dev.txt"
./tmp/configuration1/configuration_dev.txt
./tmp/configuration2/configuration_dev.txt
我想将两个文件的内容直接作为 bash 命令连接成一个新文件。
答案1
一种可能的方法是通过将输出通过管道传输到find
并xargs
通过连接文件的内容cat
,然后可以将输出重定向到新文件:
find . -name '*file*' | xargs -I{} cat "{}" > output
上述命令将cat
调用每个文件,然后语句的整个输出 xargs
将重定向到文件output
。更有效的方法是使用空分隔符 - 得益于@pLumo对于此更新:
find . -name '*file*' -print0 | xargs -0 cat > output
答案2
实现所需结果的命令是:
find . -name "configuration_dev.txt" -exec cat > testing.txt {} +
这里对上面这一行进行了很好的解释:find 的 -exec 命令中的 {} + 是什么意思?
答案3
您还可以在 中打开多个文件cat
并将输出重定向到新文件。由于 会返回多个文件的名称find
,因此您可以在cat
using `
(反引号)中使用它:
cat `find . -name "configuration_dev.txt"` > testing.txt
反引号之间的命令将被执行并由命令的输出替换,删除尾随的新行字符并插入空格。
您可以通过运行来确认
A=`find . -name "configuration_dev.txt"`
echo $A
您会发现输出类似于:
./tmp/configuration/configuration_dev.txt ./tmp/configuration/configuration_dev.txt
因此,实际的cat
命令将是:
cat ./tmp/configuration/configuration_dev.txt ./tmp/configuration/configuration_dev.txt > testing.txt
答案4
Rust 工具fd
,它是 的用户友好型替代方案find
,使这一切变得非常容易。
fd -X cat \; "configuration_dev.txt" . > output
-X
是一次性对所有搜索结果批量执行命令。这个命令的好处是(自 v8.4.0 起) 是它不会因错误而失败Argument list too long
。