11

複数のディレクトリに写真があります。jpegtran(コマンドラインツール)を使用して、それぞれを再帰的に調べ、最適化し、保存(上書き)したい

それらがすべて1つのフォルダーにある場合、私はこれを使用します

for JPEG in *.jpg ; do jpegtran -optimize $JPEG > $JPEG; done

しかし、それを再帰的に動作させて、同じファイルを(新しいファイル名ではなく)上書きすることはできません

任意のヒント?

4

4 に答える 4

26

jpegtran ディレクトリ全体

find /the/image/path -name "*.jpg" -type f -exec jpegtran -copy none -optimize -outfile {} {} \;
于 2013-04-07T08:10:42.073 に答える
5

find次のコマンドを使用してはどうですか。

find /your/dir -name '*.jpg' -exec echo jpegtran -optimize {} \;

コマンドを実行します。出力が気に入ったら、削除echoして実行します。

于 2012-10-11T02:58:17.830 に答える
3

通常、そのような場合はfindを使用する方がはるかに簡単です。なぜなら、実行したいのはいくつかのファイル名に作用するからです。findユーティリティは、それらの名前を提供します。GNU (または場合によっては BSD) ツールを持っていると仮定すると、次の例はこの一般的なシナリオを示しています。

例えば:

$ find ~/images/wallpapers/TEMP/ -type f -iname '*jpg' \
    -exec sh -c 'jpegtran -outfile {}.out -optimize {}; mv {}.out {} ' \;
  1. findは、TEMP フォルダー内の jpg で終わるすべてのファイルを再帰的に検索します。
  2. 見つかったすべての完全なファイル パス(`{}' で示される) に対して、findは -exec に指定されたコマンドを実行します。
  3. -exec オプションは、 shを介して 1 つではなく複数のコマンドをチートして実行します

ノート

cat file > file同じファイルからの読み取りと書き込みを同時に行うことは、bashでは明確に定義されておらず、サポートされていないため、許可されていません。

于 2012-10-11T03:00:00.933 に答える