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"
(しかし、この特別な場合にはコードの読み取りが難しくなるので、/
その部分を引用されていません)。