私はManjaro GNU / Linuxを使用しています。このディレクトリの下には、などfiles
の名前を持つサブディレクトリが約650個あります。file1
file2
file3
各サブディレクトリには2〜11個の画像があります.tif
。
以前と同じ名前の同じサブディレクトリにあるすべてのイメージを自動的に.tif
変換.jpeg
または維持するコマンドまたはスクリプトを作成したいと思います。.jpg
私は次のコマンドがあることを知っています。
convert source.tif ~/converted.jpg
助けてもらえますか?
ありがとうございます!
ベストアンサー1
最も簡単な方法は、ファイル名のサフィックスを使用して見つかった各ファイルを変換するfind
短いインラインスクリプトを実行することです。.tif
find files/ -name '*.tif' -type f -exec sh -c '
for pathname do
convert "$pathname" "${pathname%.tif}.jpg"
done' sh {} +
上記のインラインスクリプトは、sh -c
バッチで見つかった通常のファイルのパス名(サフィックスはディレクトリの下にあります)として呼び出されます。パラメータ置換は値からサフィックスを削除し、最後に追加します。find
.tif
files
${pathname%.tif}.jpg
.tif
$pathname
.jpg
文字列で始まる〜650個のサブディレクトリのみを探し、他のサブディレクトリは無視するのではなくfiles/file*/
検索パスとして使用されます。files/
files
file
これによりファイルは所定の位置に保持されますが、ループ内のコマンドの後にファイルを追加すると、.tif
正常な変換後にファイルを削除できます。&& rm "$pathname"
convert
zsh
シェルでは、find
シェルの高度なファイル名一致と文字列操作機能を放棄して使用できます。
for pathname in files/**/*.tif(D-.); do
convert $pathname $pathname:r.jpg
done
ここではfiles/**/*.tif(D-.)
、名前がディレクトリ内または下で終わるすべての一般的なファイルのリストに展開されます。最後にワイルドカードがある場合、ワイルドカードパターンは通常のファイル(「隠された」名前がある可能性があります)のみに一致します。.tif
files
(D-.)
その後、パス名(ファイル拡張子のない名前)の「ルート」が:r
提供されます$pathname
。
サブディレクトリのファイルfiles/file*/**/*.tif(D-.)
にのみ検索を制限するために使用されます。file*
シェルを使用すると、bash
次のように上記のような操作を実行できます。
shopt -s dotglob failglob globstar
for pathname in files/**/*.tif; do
convert "$pathname" "${pathname%.tif}.jpg"
done
ここで設定されているシェルオプションを使用すると、隠された名前にワイルドカードおよびワイルドカード演算子を使用できます**
。また、zsh
シェルのデフォルト値と同様に、一致しないパターンが原因でエラーが発生します。