我有许多同名的文件分布在许多具有不同名称的子目录中(尽管都在同一级别)。我想将所有相同的文件连接到一个具有该名称的新文件中。我希望这个新文件位于父目录中。
我已经尝试过在 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
您必须分两步执行此操作:
- 查找所有唯一的 Fasta 文件名。
- 对于每个名称,找到具有该名称的所有文件并将它们连接起来。
附代码:
查找所有 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 {} +