任意のフォルダの中を検索し、条件に一致したファイルがあれば処理をするシェルスクリプトを書きたい


行いたい処理が2つあるのですがうまく書けずに困っています。  
処理したい事は下記になります。

### 1

  * フォルダAの中にある*.rarを再帰的に検索
  * 検索にヒットした*.rarファイルを全てzipファイル変換

[code]

    if [ *.rarをfindする処理 ]; then
        *.rarをzipに変換する処理
    fi
    
[/code]

### 2

  * フォルダBの中にあるファイル名に大文字の空白があるファイルを再帰的に検索
  * 検索にヒットしたファイルのファイル名の大文字の空白を削除する

[code]

    if [ 空白文字をfindする処理 ]; then
    　　sedで空白文字を削除処理
    fi
    
[/code]

何かいい書き方があれば教えていただければ幸いです。

例えば下記のようなディレクトリ構造です。

[code]

    animals  
    ├── bird  
    │   ├── bird_1.rar  
    │   ├── bird_2.rar  
    │   ├── bird_3.rar  
    │   ├── bird_4.rar
    │   ├── bird_5.rar
    │   └── penguin
    │       ├── p　enguin_1.txt
    │       ├── p　enguin_2.txt
    │       ├── p　enguin_3.txt
    │       ├── p　enguin_4.txt
    │       └── p　enguin_5.txt
    ├── cat
    │   ├── cat_1.rar
    │   ├── cat_2.rar
    │   ├── cat_3.rar
    │   ├── cat_4.rar
    │   └── cat_5.rar
    └── dog
        ├── dog_1.rar
        ├── dog_2.rar
        ├── dog_3.rar
        ├── dog_4.rar
        └── dog_5.rar
    
[/code]




仕事か授業の課題の丸投げですか? ヒントのみ。

指定したディレクトリ下のすべての `*.rar` ファイルを表示するだけ。`echo "$rar"` の部分を RAR → ZIP
するシェルスクリプトを組めば 1 の課題は完成。

[code]

    #!/bin/sh
    find "$@" \
      -type f \
      -name '*.rar' \
      -exec sh -c \
        'for rar in "$@"; do echo "$rar"; done' \
        sh {} + \
    ;
    
[/code]

同様に 2 も簡単ですね。

`find` の `-exec`
節のシングルクォート内にシェルスクリプトを記述するのが気持ち悪いとかなら、ちょっと遅いけどこんな風にも書けます。指定したディレクトリ下の名前にいわゆる全角スペース
(U+3000 IDEOGRAPHIC SPACE)
を含むファイルの名前を列挙するだけの例。ただし、ファイル名に改行を含むものが存在する場合はうまく動きません。

[code]

    #!/bin/sh
    find "$@" \
      -type f \
      -name '*　*' \
      -print \
    |while IFS= read -r name; do
      echo "$name"
    done
    
[/code]

