スペースを含むディレクトリglobのforループは機能しません。

スペースを含むディレクトリglobのforループは機能しません。

2番目の場所にミラー化されたディレクトリとファイルを繰り返し処理しようとしています。
私が定義した関数は次のとおりです。

#!/bin/bash
set -e
shopt -s nullglob
shopt -s dotglob
dom() {
    echo "Dirs:";
    for elem in "$1/*/"; do
        if test -d "$elem"; then
            echo is Dir # Is never called
        fi
        echo "$elem"; # intended to be dom "$elem" "$2"
    done;
    echo "Files:";
    for elem in "$1/*"; do # Same issues as above
        if test -f "$elem"; then
            echo "$elem is File" # is never called
        fi
        echo do stuff with "$elem" "$2/$elem";
    done;
}

dom "$2" "$1";

ディレクトリ構造は次のとおりです。

- My Directory With Spaces/Subdir/...
- My Directory With Spaces/Subdir with Spaces/...
- My Directory With Spaces/Files...

- Other Dir/My Directory With Spaces/Subdir/...
- Other Dir/My Directory With Spaces/Subdir with Spaces/...
- Other Dir/My Directory With Spaces/Files...

私が経験している問題は、globが正しく解析されないこと、または-loopがforパス名にスペースを含む単語を繰り返すことです。上記のコードを使用すると、次のような結果が得られます。

$ ./script.sh Param1 My\ Directory\ With\ Spaces
Dirs:
My Directory With Spaces/*/
Files:
do stuff with My Directory With Spaces/* Param1/My Directory With Spaces/*

$ ./script.sh Param1 My\ Directory\ With\ Spaces/
Dirs:
My Directory With Spaces//*/
Files:
do stuff with My Directory With Spaces//* Param1/My Directory With Spaces//*

しなければならない

$ ./script.sh Param1 My\ Directory\ With\ Spaces
Dirs:
My Directory With Spaces/Subdir/
My Directory With Spaces/Subdir with Spaces/
Files:
do stuff with My Directory With Spaces/Files Param1/My Directory With Spaces/Files

$ ./script.sh Param1 My\ Directory\ With\ Spaces/
Dirs:
My Directory With Spaces/Subdir/
My Directory With Spaces/Subdir with Spaces/
Files:
do stuff with My Directory With Spaces/Files Param1/My Directory With Spaces/Files

テストは以前に処理されたディレクトリをスキップしますが、デバッグエコーは現在デバッグのために外部にあります。

実際、質問は次のとおりです。なぜglobが期待どおりに機能しないのですか?

私は$1/*/そのような言葉を引用したりしないように努めましたが${1// /\\ }/*/、それはもっと奇妙なことをしました。ディレクトリを変更して戻ることも実行可能なオプションではありません。

次の質問は役に立ちませんでした。

ベストアンサー1

現在遭遇している問題は、ディレクトリ名の空白に由来するのではなく(一般的に)適用された回避策、つまりシェル変数を正しく引用することによって発生します。

適用した引用符は、ファイル名とディレクトリ名をスペースで指定する正しい方法ですが、引用符内ではグローバル拡張は無効になります。これが*デバッグ出力にテキストが表示される理由です(例:このQ&A)。

この場合、解決策はワイルドカード部分を維持することです。外部引用符など

for elem in "$1/"*/; do ... ; done

そして

for elem in "$1/"*; do ... ; done

以下のように、実際に引用されていない変数参照の引用されていない部分にglobを「挿入」することができます"$1/"*"/$2 and some static text"(しかし、この特別な場合にはコードの読み取りが難しくなるので、/その部分を引用されていません)。

おすすめ記事