Bashはファイルのペアを繰り返します。

Bashはファイルのペアを繰り返します。

同じ名前の複数のファイルを含むディレクトリがあり、それぞれに対応するa04x.txtファイルがb04y.txtあります。各ファイルペアに対していくつかのコマンドを実行し、c04z.txt各ペアに対して追加のファイルを生成できる必要があります。

ファイル内の実際の数字はかなり大きく、リーンなので、1から99までのすべての数字または同様の数字を単純に繰り返すことは機能しません。

現在、私はタスクを処理するために次のアプローチを使用していますが、これを行うにはより短くより良い方法が必要なほど一般的なタスクのようです。

for num in ./a*x.txt
do
  num="${num##*/a}"
  num="${num%x.txt}"

  my_command a${num}x.txt b${num}y.txt c${num}z.txt
done

a${num}x.txt理想的には、b${num}y.txt同じ番号の一致するファイルがある場合やファイルがない場合に警告を受けたいと思います。また、ファイルセットをパイプで接続しxargsたり、parallel同時に複数のファイルセットを処理したりする簡単な方法が必要です。

もっと良い方法がありますか?

ベストアンサー1

GNU Parallelにはこれを行う方法があり、ボーナスでコマンドを並列に実行します。

$ parallel my_command {} \
                      {= s/a([0-9]+)x.txt/b\1y.txt/ =} \
                      {= s/a([0-9]+)x.txt/c\1z.txt/ =} \
           ::: a*x.txt

これらの代替品はPerlコードです。改行は単に可読性のためのものです。一度に1行ずつ表示されます。

おすすめ記事