forループの内容を自動的にエコーします。

forループの内容を自動的にエコーします。

私は多くの場合、複数のファイル形式を変換するためにforループを使用します。場合によっては、テキスト変換または変数が発生したときに置換が正しく行われたことを確認することをお勧めします。

for i in *; do convert $i ${i%jpg}png; done

実行されたコマンドを簡単に表示する方法はありますか?上記の例によると、おおよそ次のようになります。

convert image1.jpg image1.png
  # command output
convert image2.jpg image2.png
  # command output
  # ...

答え1

set -x
for file in *jpg; do
    convert "${file}" "${file%jpg}png"
done
set +x

シェルオプションを設定すると、-xすべてのパラメータ拡張が完了した後に実行されるように設定され、実行されたすべてのコマンドが表示されます。 +xこの操作を元に戻してください。

答え2

この種の場合、対応するxtraceオプション(set -x// set -o xtrace/ setopt xtrace...に設定options[xtrace]=on)も使用されますが、サブシェルでは次のようになります。

(set -x; for f (*.jpg) convert -- $f $f:r.png)

(これはまた、作業制御をより明確にし、誤って変数が環境を汚染するのを防ぎます$f)。

サブシェルを作成せずにローカルでオプションを設定するには、匿名関数とオプションを使用することもできますlocaloptions

(){ set -o localoptions -x; for f (*.jpg) convert -- $f $f:r.png; }

(そして、その匿名関数にローカルlocal f にするには、aを追加してください$f)。

for f (*.jpg) (set -x; convert -- $f $f:r.png)

あまり冗長にし、プロセスを保存します。

ただし、ImageMagickイメージ変換の場合は、次のことができます。

$ mogrify -verbose -format png -- *.jpg
a.jpg JPEG 3264x1836 3264x1836+0+0 8-bit sRGB 2.07201MiB 0.050u 0:00.053
a.jpg=>a.png JPEG 3264x1836 3264x1836+0+0 8-bit sRGB 7.69297MiB 2.680u 0:02.640
b.jpg JPEG 3264x1836 3264x1836+0+0 8-bit sRGB 2.07201MiB 0.060u 0:00.050
b.jpg=>b.png JPEG 3264x1836 3264x1836+0+0 8-bit sRGB 7.69297MiB 2.650u 0:02.617

関連情報