将多个子目录中具有相似名称的文件连接到新文件

将多个子目录中具有相似名称的文件连接到新文件

我正在尝试连接名称相似但位于不同子目录中的所有文件。

我找到了这个用于精确文件匹配的解决方案,但我不确定如何使其适应部分匹配

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

示例文件路径:

out/ch1/name1.1.assoc.txt
out/ch1/name2.1.assoc.txt
out/ch1/name3.1.assoc.txt

out/ch2/name1.2.assoc.txt
out/ch2/name2.2.assoc.txt
out/ch2/name3.2.assoc.txt

我有 20 个不同的 ch 目录,文件名中的最终数字与目录号匹配。

我有一个文件,其中包含我要连接的名称。

name1 
name2
name3

我如何调整此解决方案或以其他方式连接此文件?最终结果 我想要一个目录,其中文件列表中的每个名称都有一个文件(在本例中,最终结果将是 3 个名为 name1、name2 和 name3 的文件)。我们

答案1

zsh

for name (${(f)"$(<names.txt)"})
  cat -- out/ch<->/$name.<->.assoc.txt(.n) > outdir/$name

bash

zsh -c '
  for name (${(f)"$(<names.txt)"})
    cat -- out/ch<->/$name.<->.assoc.txt(.n) > outdir/$name
'

如果你无法安装,你可以在 GNU 系统中或在 GNU 系统上zsh执行一些操作:bash

readarray -t files < <(grep . names.txt)
shopt -s extglob failglob
for name in "${files[@]}"; do
  printf '%s\0' out/ch+([0123456789])/"$name".+([0123456789]).assoc.txt |
    sort -zV |
    xargs -r0 cat -- > outdir/"$name"
done

相关内容