it-swarm-ja.com

シェルスクリプト、フォルダを反復処理

私は非常に基本的なシェルスクリプトの知識を持っています。

このような多くの異なるフォルダのoriginalフォルダの下に写真があります

folder
  + folder1
    + original
  + folder2
    + original
  + folder3
    + original
  + folder4
    + original

mogrifyを使用して、これに対する構造に従ってthumbフォルダーの下に親指を作成しようとしています。

folder
  + folder1
    + original
    + thumb
  + folder2
    + original
    + thumb
  + folder3
    + original
    + thumb
  + folder4
    + original
    + thumb

反復する可能性のあるシェルスクリプトの書き方に少し迷っています。 mogrifyに設定を与えても大丈夫ですが、各フォルダーを繰り返してmogrifyコマンドを実行するようにスクリプトに指示する方法を完全には理解していません。

2
Martin

ファイルパスのいずれかにスペースがある場合に問題が発生するforループを使用するのではなく、findを使用してディレクトリの下を再帰的に調べ、名前がパターンに一致するすべてのファイルに対してアクションを実行できます。すべてのファイルに影響を与える必要がある場合は、-nameオプションを省略するか、それに合わせてカスタマイズしてください。

find /path/to/directory -type f -name "*.png" -exec mogrify {} +

Mogrifyのオプションをより有効に活用するために、xargsを使用できます。

find /path/to/directory -type f -name "*.png" | xargs mogrify -path /path/to/thumbnails
4
MaQleod

受け取る応答には、かなりのバリエーションが見られると確信しています。それを行うにはいくつかの方法があります。次のアプローチでは、単にlsを使用して、現在のディレクトリ内のディレクトリを一覧表示します。次に、そのディレクトリに移動して、pngファイルのリストを取得します(適切に変更します)。 pngファイルごとに、mogrifyが呼び出されます。

基本的に、あなたはする必要があります

  1. これをテキストエディタにコピーします。
  2. Mogrifyコマンドを含む行を適切に変更します。
  3. 簡単にするために、実行するディレクトリにプレーンテキストファイルとして保存します。
  4. chmod +x /path/to/scriptnameでファイルの実行ビットを設定します
  5. ./scriptnameのディレクトリから実行します

以下のスクリプト:

DIRS="$(find . -mindepth 1 -maxdepth 2 -type d)"

for d in $DIRS
do
    cd $d
    FILES="$(find . -name '*.png')"
    for f in $FILES
    do
    mogrify -path ./thumbnails/ $f
    done
    cd ..
done
1
ephsmith