2017-03-16 8 views
1

パターン内のすべてのパスを検索しようとしていますが、私は固執しています。このディレクトリの構造シェルスクリプト:パターン内のすべてのパスを確認します

testdir 
|-- dir with spaces 
| |-- subdir 
| | | 
| | |-subfile.sh 
| |  
| +-- 1.sh 
| | 
| +-- 2.sh 
| 
+-- dir1 
| | 
| | 
| +-- file.sh 
| 
+-- test.sh 

が、これは私は私が取得しようとしています

出力は

-flag testdir/dir\ with\ spaces/1.sh 
-flag testdir/dir\ with\ spaces/2.sh 
-flag testdir/dir\ with\ spaces/subdir 
-flag testdir/dir\ with\ spaces/subdir/subfile.sh 
-flag testdir/dir1 
-flag testdir/dir1/file.sh 
-flag testdir/test.sh 

で欲しいtestdir/**/*

を持ってパスパターンです私が試したもの

pathpattern=testdir/**/* 
echo $pathpattern 

それは、次の

testdir/dir with spaces/1.sh testdir/dir with spaces/2.sh testdir/dir with spaces/subdir testdir/dir1/file.sh 
  1. を印刷し、私はパスパターンのエコーをやってみましたが、それはすべてのものを返しませんでした。
  2. 私はまた、スペースを持つエントリを処理することを知らない。私は$ pathpatternをループしてみましたが、新しいパスとスペースを持つパスを区別することができませんでした。

答えて

1

これはそれを行う必要があります。

printf -- "-flag %q\n" testdir/**/* 

しかし、これはおそらく達成するための非常に貧弱な方法のようです。実際の最終目標を知らなくても、それを正しく行う方法を提案するのは難しいです。通常、ファイル名を含む変数や文字列を生成したくない場合は、代わりに配列を使用している可能性があります。しかし、おそらくあなたは、単に

for file in testdir/**/*; do 
    : ... something with "$file" 
done 

をするアレイソリューションは

#!/bin/bash 
#^sh doesn't have arrays 
array=($(printf " -test %q" testdir/**/*)) 
your --program --call ${array[@]} --more arguments 
+0

のようになります。これに対応するために時間を割いていただき、ありがとうございます。印刷する最初のオプションは私にエラー "printf:-f:無効なオプション"を与えます。私はすでに2つ目のオプションを試しました。それはスペースを含むパスを2つの結果に分割します。なぜ私はこれが必要なのあなたの質問に - 私は使用しているAPIのいずれかの除外パスを指定しようとしています。入力仕様では、パスパターンを使用して除外するパスを決定します。 – Subbu

+0

私は 'printf'エラーを修正する答えを編集しました。申し訳ありません。ループ内でループ変数を二重引用符で囲まなかったように、 'for'ループがどのように失敗したかについてのあなたの記述。 – tripleee

+0

'api --call --options $(printf - " -flag%q ")-more options'のようなものは、おそらく結果を変数に保存しないことになります。これは常に厄介です。これをやることができない場合は、配列を使用することをお勧めします。これに関するFAQがあります。 http://mywiki.wooledge.org/BashFAQ/050を参照してください。 – tripleee

関連する問題