私の問題:findコマンドで返された結果が「最新」状態ではないようです。
私は次のようなbashスクリプトを持っています:
- ディレクトリからgifファイルのリストを取得します。
- pngを作成するには(imagemagickで)変換を使用します。
- 同じディレクトリにあるpngファイルのリストを取得します。 (ここにgifファイルがある場合は、以前に作成されたファイルが含まれている可能性があります。)
- 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
、名前が次または下に終わるすべての一般的なファイルを見つけて$topdir
PNG画像に変換します。
次に、すべての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 {} +
または**
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
)、問題が何であるかを説明するエラーメッセージを探してみましょう。