ファイル名のペア別の組み合わせ

ファイル名のペア別の組み合わせ

たとえば、ディレクトリにn個のファイルがあるとします。

a
b
c

これらのファイルの組み合わせ(非指定)を関数にどのように渡すことができますか?

予想される出力は次のとおりです。

a-b
a-c
b-c

このようにして、次の関数に渡すことができます。

fn -file1 a -file2 b
fn -file1 a -file2 c
...

これが私が今試していることです。

for i in *.txt
 do
  for j in *.txt
   do
    if [ "$i" != "$j" ]
     then
      echo "Pairs $i and $j"
     fi
   done
 done

出力

Pairs a.txt and b.txt
Pairs a.txt and c.txt
Pairs b.txt and a.txt
Pairs b.txt and c.txt
Pairs c.txt and a.txt
Pairs c.txt and b.txt

私はまだ重複したファイルを持っていて(abはbaと同じです)、おそらくこれを行うより良い方法があると思いました。

ベストアンサー1

ファイル名を配列に入れ、2つのループを介して手動で実行します。

次の場合は、1つの一致のみを取得できます。j <私どこそしてジェイ外部ループと内部ループでそれぞれ使用されるインデックスです。

$ touch a b c d
$ f=(*)
$ for ((i = 0; i < ${#f[@]}; i++)); do 
      for ((j = i + 1; j < ${#f[@]}; j++)); do 
          echo "${f[i]} - ${f[j]}"; 
      done;
  done 
a - b
a - c
a - d
b - c
b - d
c - d

おすすめ記事