検索結果は最新ではありません。

検索結果は最新ではありません。

私の問題:findコマンドで返された結果が「最新」状態ではないようです。

私は次のようなbashスクリプトを持っています:

  1. ディレクトリからgifファイルのリストを取得します。
  2. pngを作成するには(imagemagickで)変換を使用します。
  3. 同じディレクトリにあるpngファイルのリストを取得します。 (ここにgifファイルがある場合は、以前に作成されたファイルが含まれている可能性があります。)
  4. optipngを使用して最適化します。

このスクリプトをそのままにしておくと、gifがあるとそのpngが見つかりません。キーボードで読んでスクリプトを強制的に一時停止すると、新しいpngが見つかります。

私の説明:

  • 変換がすぐに返されるので、gifをpngファイルにする前にfind pngが実行されます。この場合、次のコマンドを強制的に待つ方法は何ですか?
  • あるいは、 find コマンドは更新に時間がかかるシステム機能の一部を使用します。この場合、ディレクトリ情報を強制的に更新するにはどうすればよいですか?

ありがとう

ベストアンサー1

4つのステップに従います(「リストのインポート...」ステップは必要ないので無視)。

#!/bin/bash

topdir=some/directory/path

find "$topdir" -type f -name '*.gif' -exec sh -c '
    for gifpath do
        convert "$gifpath" "${gifpath%.gif}.png"
    done' sh {} +

find "$topdir" -type f -name '*.png' -exec optipng {} \;

まず.gif、名前が次または下に終わるすべての一般的なファイルを見つけて$topdirPNG画像に変換します。

次に、すべてのPNG画像を同じ方法で見つけ、optipng各画像で実行します(私はこのコマンドについて何も知らないので、ここでは推測です)。 2番目は、findスクリプトを実行する前に存在していた可能性があるPNG画像も探します。

新しく作成されたPNG画像でのみ実行するには、optipng次を使用しますfind

find "$topdir" -type f -name '*.gif' -exec sh -c '
    for gifpath do
        pngpath=${gifpath%.gif}.png
        convert "$gifpath" "$pngpath"
        optipng "$pngpath"
    done' sh {} +

関連:「find」の-execオプションについて

または**inを使用してbash再帰的に一致させます$topdir

#!/bin/bash

topdir=some/directory/path

shopt -s globstar nullglob dotglob

for gifpath in "$topdir"/**/*.gif; do
    if [ -f "$gifpath" ]; then
        pngpath=${gifpath%.gif}.png
        convert "$gifpath" "$pngpath"
        optipng "$pngpath"
    fi
done

上記の各コードスニペットでは、コマンドoptipngはコマンドが完了するまで実行されませんconvert。それでも説明した性質と同じ問題が発生した場合(後でPNG画像を使用できない場合convert)、問題が何であるかを説明するエラーメッセージを探してみましょう。

おすすめ記事