Linux 如何连接具有相同前缀(和许多前缀)的文件?

Linux 如何连接具有相同前缀(和许多前缀)的文件?,linux,bash,Linux,Bash,我有许多具有相同前缀的文件,只是下划线后的位不同。我也有很多前缀! 下划线不会出现在文件名的其他任何位置。如何将具有相同前缀的所有文件连接到新文件中? 我要补充的是,我有数千个不同的前缀,无法将它们输入循环。您可以执行以下操作: cat /path/prefix* >> new_file 它将cat(即,连接文件并在标准输出上打印)名称与/path/prefix匹配的所有文件。文本的其余部分可能有所不同 在执行该操作之前,最好执行ls/path/prefix*,以确保它获得了所有(

我有许多具有相同前缀的文件,只是下划线后的位不同。我也有很多前缀! 下划线不会出现在文件名的其他任何位置。如何将具有相同前缀的所有文件连接到新文件中?
我要补充的是,我有数千个不同的前缀,无法将它们输入循环。

您可以执行以下操作:

cat /path/prefix* >> new_file
它将
cat
(即,
连接文件并在标准输出上打印
)名称与
/path/prefix
匹配的所有文件。文本的其余部分可能有所不同

在执行该操作之前,最好执行
ls/path/prefix*
,以确保它获得了所有(并且只有这些)您想要考虑的文件

例子
如果您的文件量非常大,那么有时候仅仅使用shell globbing(
prefix.*
等等)是不合适的

您可以使用循环并逐个附加它们,然后:

find dir -type f -name 'prefix_*' -exec bash -c 'cat "{}" >> result' \;
这将把所有匹配
前缀的文件逐个附加到文件
结果
(如果有疑问,应使用
rm结果
,文件开头不应存在)

如果有很多不同的前缀,当然可以在一个组之后追加另一个组,而无需删除中间的
结果
文件


当然,也可以使用Unix工具
find
提供的所有其他选项。但是如果您需要帮助,请随时再次询问。

我不得不做一些非常类似的事情,我不觉得前面的答案可以解决您的问题,因为如果有许多不同的前缀,而不仅仅是带有许多相同前缀的文件的几个前缀,它们需要大量的手动输入。如果我知道前缀的模式,我可以给你更具体的建议,但现在我只想假设前缀是以前导零编号的(就像我的文件一样)。我将假设以下情况,但它们不一定是真的:

~/test01/001-test.txt
~/test01/002-test.txt
~/test01/003-test.txt

~/test02/001-test.txt
~/test02/002-test.txt
~/test02/003-test.txt
设置好后,我将切换到一个合并目录,希望所有合并文件都写入其中,然后在for循环中运行cat命令

cd ~/merge

for i in {001..003}; do cat ../test*/"$i"*.txt > "$i"-merge.txt ; done
这将使用001、002和003作为前缀,并在所有测试目录中查找与这些前缀匹配的文件,并按找到它们的顺序将它们合并在一起。最终结果将显示在:

~/merge/001-merge.txt
~/merge/002-merge.txt
~/merge/003-merge.txt

我知道这已经很晚了,但希望它能帮助其他人。我必须用5000个前缀来做这件事,所以我完全理解。

我有一个类似的问题,有很多文件,想按前缀对它们进行分组和分类,我使用了以下小脚本:

ls | awk -F '_' '!x[$1]++{print $1}' | while read -r line
do
    cat $line* > all_$line\.txt
done
ls
将显示目录中的所有文件

awk
中,
-F'.
选项将下划线设置为分隔符,代码本身的行为类似于uniq,这意味着每个前缀只打印一次


然后,我们对所有前缀和
cat
具有相同前缀的所有文件运行一个循环。

问题是,我有数千个前缀,因此需要使用正则表达式的解决方案。然后请提供有关您问题的更多上下文:)不同的前缀,如什么?上面有图案吗?你提供的信息越多,人们就越能提供帮助@DoubleDecker@DoubleDecker,这个答案中的答案是正确的。是否要排除某些文件?e、 g.包括
\u*
,但不包括
\u*
(双下划线)?请澄清要连接的文件类型。还要澄清是否要从连接中排除一些。
cat prefix\u*>一些新的\u文件
也许?是否每次
cat$line*>all\u$line\.txt
都会覆盖
all\u$line\.txt
文件?我认为
cat$line*>>all_$line\.txt
可以满足您的需要。不,因为我使用
cat$line*
将具有相同前缀(请注意*)的所有文件cat到包含前缀(all_$line)的文件名中。因此,基本上每次循环都会将一组具有相同前缀的文件连接到一个新文件中。
ls | awk -F '_' '!x[$1]++{print $1}' | while read -r line
do
    cat $line* > all_$line\.txt
done