「convert」と「xargs」を一緒に使用するにはどうすればいいですか?

「convert」と「xargs」を一緒に使用するにはどうすればいいですか?

多数の.rgbファイルを に変換する必要があります.png(各ファイルは元の名前を保持する必要があります)。

最初のファイルを変換し、コマンドを「for」ループでラップする方法を知りたいです。

これまでのところ、次のものがあります:

find . -name "*.rgb" | sort | sed -n \1\p | xargs convert zzzzz.png

しかし、これは機能しません。

convertコマンドに 2 番目の引数を認識させるにはどうすればよいですかzzzzz.png?

答え1

ディレクトリツリー内のすべてのファイルを変換したい場合は、次のコマンドを実行します。

find . -name '*.rgb' | parallel convert {} {.}.png

これは並行して実行されます:

convert ./foo.rgb ./foo.png
convert ./bar/quux.rgb ./bar/quux.png

ここでは、すべてのCPUを活用するためにGNU Parallelを使用しています。システムに応じてパッケージとしてインストールできますが、そうでない場合はここにあります。gnu.org/ソフトウェア/並列Debian では次のようになります:

apt-get install parallel

編集:
以下はなしの解決策ですGNU Parallel:

find . -name '*.rgb' -exec sh -c 'convert "$0" "${0%.*}.png"' {} \;

あまり良くない解決策としては、以下がありますwhile..read:

find . -name '*.rgb' | while read FILE; do convert "${FILE}" "${FILE%rgb}png" ; done

答え2

一つのディレクトリにあるすべての画像を変換(私の場合はサイズ変更)するには、

ls *.jpg | xargs -I {} convert {} -resize 1024x768 resized/{}

ファイル名の中括弧プレースホルダーを 2 回使用できることに注意してください。また、これを使用して、ターゲット ファイル名にプレフィックスを追加することもできます。

再帰検索の場合:

find -name '*.jpg' | xargs -I {} convert {} -resize 1024x768 resized/{}

答え3

答えを見つけました:

for i in 'seq 1 $numOfRGBfiles'; do
#Insert code here that finds the file
#name of each rgb file and stores it 
#in $filename.

'find . -name "*.rgb" | sort | sed -n 
\$i\p |  xargs -I {} convert {} 
\$filename.png'
done

関連情報