unrar は for 文では機能しません。 For ステートメントを早く終了する方法

unrar は for 文では機能しません。 For ステートメントを早く終了する方法

以下は、forステートメント内でunrarステートメントを作成する方法を見つけるためのより大きなコードの一部です。

DST_DIR="/Volumes/Mac_Storage/Test_Folder"
cd "/Volumes/Mac_Storage/Test_Data"

find "$filePath" -type f "${EXT_OPTS[@]}" -exec sh -c '
for pathName do
    unzip -o '*.zip' && unrar e -r '*.rar' "$DST_DIR" && rm *.r* 
    echo "$pathName"
    printf "%s\n" "$pathName"
    sleep 1
done' sh {} +

問題のある行:

unzip -o '*.zip' && unrar e -r '*.rar' "$DST_DIR" && rm *.r*

外部ではうまく機能しますが、forステートメントに追加するとすぐにファイル名の不一致エラーが発生します。

乾杯

答え1

DST_DIRスクリプト内の変数は、sh -c呼び出しシェルの同じ名前の変数とは異なりますfind。あなたは設定する必要がありますDST_DIR ~へscript として使用sh -cまたは呼び出すときに渡します。

find ... -exec sh -c '
    DST_DIR="/Volumes/Mac_Storage/Test_Folder"
    for pathName do
        # more code here
    done' sh {} +

ここで、変数は内部スクリプトからリテラル文字列に値を取得します。DST_DIR他の場所で変数を使用しない場合は、前の場所から変数を削除できます。

または、

find ... -exec sh -c '
    DST_DIR=$1; shift
    for pathName do
        # more code here
    done' sh "$DST_DIR" {} +

ここで、変数値はコマンドラインを介して外部環境から内部スクリプトに渡されます。最初のパラメータは$1スクリプトに入力された値を保持します。内部DST_DIR変数に割り当てられた後に$1移動します$@。その後、サイクルは以前と同様に続きます。

関連情報