在多个目录中创建新的同名串联文件

在多个目录中创建新的同名串联文件

我有许多同名的文件分布在许多具有不同名称的子目录中(尽管都在同一级别)。我想将所有相同的文件连接到一个具有该名称的新文件中。我希望这个新文件位于父目录中。

我已经尝试过在 SE 上发布的一些答案:如何移动同名文件并连接

这是我尝试过的方法和问题:

find */*/*/seq/in/ -type f -name '*.fasta' -exec bash -c 'cat "{}" >> new_file' \;

这会将所有带有后缀 .fasta 的文件连接到一个名为 new_file 的文件中,而不仅仅是那些具有匹配名称的文件。

for file in */*/*/seq/in/*.fasta; 
do 
cat "$file" >> "$file.cat" done

这只是在同一原始子目录中复制了每个文件,并附加了 .cat

我究竟做错了什么?太感谢了!

答案1

您必须分两步执行此操作:

  1. 查找所有唯一的 Fasta 文件名。
  2. 对于每个名称,找到具有该名称的所有文件并将它们连接起来。

附代码:

查找所有 Fasta 文件(假设文件名正常,没有嵌入换行符):

find . -type f -path '*/seq/in/*.fasta' -exec basename {} ';' | sort -u -o file.list

然后对于每个名称,连接具有相同名称的所有文件。生成的文件将被放置在new当前目录的目录中。新文件的名称将与串联文件的名称相同。

mkdir new
while read -r name; do
    find . -type f -path "*/seq/in/$name" -exec cat {} + >"new/$name"
done <file.list

你那件事可能想要添加到每个find调用的是-mindepth 6 -maxdepth 6(或适当的深度,6 可能会减少 1),以便文件全部取自文件层次结构中的相同深度。在 之前插入这些选项-type f


Steeldriver 在评论中建议的替代方案,它绕过了创建单独的 Fasta 文件名列表:

mkdir new
find . -type f -path '*/seq/in/*.fasta' \
    -exec sh -c 'for pathname do cat "$pathname" >>"new/${pathname##*/}"; done' find-sh {} +

相关内容