2017-03-16 43 views
1

我正在嘗試查找模式中的所有路徑,並且卡住了。這是目錄Shell腳本:識別模式中的所有路徑

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

這種的結構的路徑模式,我有testdir/**/*

我想

什麼,我試圖讓輸出是

-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 

我試過

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:無效選項」。我已經嘗試了第二種選擇 - 它將具有空格的路徑分成兩個結果。對於你爲什麼我需要這個問題 - 我試圖爲我們正在使用的API之一指定排除路徑。輸入規範使用路徑模式來確定要排除的路徑。 – Subbu

+0

我編輯瞭解決'printf'錯誤的答案;對於那個很抱歉。你對'for'循環失敗的描述聽起來像是你沒有在循環內引用循環變量的雙引號。 – tripleee

+0

類似於'api --call --options $(printf - 「-flag%q」) - 更多的選項'可能會讓你無法將結果保存在一個始終討厭的變量中。如果你不能再這樣做,我建議使用一個數組。有關於此的常見問題;見http://mywiki.wooledge.org/BashFAQ/050 – tripleee