複数のサブディレクトリにある同じ名前のファイルを新しいファイルにリンクする

複数のサブディレクトリにある同じ名前のファイルを新しいファイルにリンクする

名前は似ていますが、別のサブディレクトリにあるすべてのファイルをリンクしようとしています。

私は正確なファイルマッチングのためにこの解決策を見つけましたが、それを部分的なマッチングに適用する方法がわかりません。

複数のディレクトリに同じ名前の新しいリンクファイルを作成する

サンプルファイルパス:

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

このソリューションを適用したり、このファイルを別の方法でリンクしたりするにはどうすればよいですか?私が望む最終結果は、ファイルリストの各名前に対して1つのファイルがあるディレクトリです(この場合、最終結果はname1、name2、name3という3つのファイルになります)。私たち

ベストアンサー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

おすすめ記事