2012-03-03 65 views
1

我有一個函數,它的第一個參數是存儲路徑到某個目錄的字符串。 這個字符串是的輸出結果。型d路徑中的列表文件

如果我列出當前目錄中的所有文件,其簡單

for file in *; do 
    commands 
done 

但與字符串它不把它當然這種方式。

for file in "$1"; do 
    commands 
done 

所以我想用LS

for file in `ls "$1"`; do 
    commands 
done` 

但是這種解決方案根本無法處理與空間中的文件,經過一番研究 我發現到處建議使用找到但我沒有得到,找到將 列出所有的文件/目錄/子目錄,只是整個樹,但我只想在當前目錄中的東西。 我會非常感謝您的幫助。

UPDATE

我已經試過了,似乎工作一兩件事:

pushd "$1" 
for file in *; do 
    echo "$file" 
done 
popd 

但我寧願一些解決方案,我沒有改變我的工作目錄

+0

現在你知道爲什麼傳統上,Unix並沒有鼓勵文件名中的空格(儘管它一直允許它們)。如果路徑名稱中沒有空格(換行符,後退空格,製表符和其他控制字符),則工具將調整爲最佳狀態。 – 2012-03-03 18:53:28

+0

使用:'(cd「$ 1」|| exit 1; ...)',因爲如果出現錯誤,這不會使主進程滯留在遠程目錄中。 – 2012-03-03 19:02:43

回答

3

如果只想非點文件,下面應該做的伎倆。

for file in "$1"/*; do 
    commands 
done 

更靈活的是下面的代碼。

while IFS= read -r -d $'\0' result; do 
    commands 
done < <(find -P "$1" -printf %p"\0") 
+1

我想,非同名文件不是隱藏的文件,所以第一個例子應該做的伎倆,謝謝:) – skornos 2012-03-03 22:16:24

0

我相信你讀過的建議是使用find的-exec函數。您可以傳遞命令來查找將爲每個找到的文件執行哪些命令。

$ find . -type d -exec stat {} \; 

首先,注意人物{}將與文件的名稱來代替,並且您需要逃脫分號\;

而且,這裏是另一個常見的Bash成語,這將幫助你在文件處理空間:

$ find . -type d | 
while read line; do 
    # commands with $line 
done; 
0

如果你能管理它,這可以有效:

(
cd "$1" || exit 1 
for file in * 
do 
    commands 
done 
) 

括號運行在一個子shell的內容。子shell將目錄更改爲指定的目錄;那麼shell的globbing會處理文件名,包括那些帶空格的文件名。主要的注意事項是,如果您執行的命令的名稱與shell啓動的當前目錄相關,則操作將打破所有操作。我的建議是「不要執行不在PATH中的命令」,在這種情況下,這不會成爲問題。

否則,審覈bash的數組和元字符擴張到陣列。他們可以處理任務。

注意find ... -print0,通常配上xargs -0可以提供幫助。

你也可以考慮:

find "$1" -type f -maxdepth 1 -exec command {} + 

這提供了文件名作爲適當的參數command,而+符號表示「方便地在命令行中儘可能多的文件名作爲適合」。這個擁有不執行命令時沒有文件被發現,而可氣的標準xargs設計(誤)功能的xargs額外的好處(GNU xargs有一個選項來覆蓋標準的行爲,當然)。

+0

感謝您的建議,因此運行在一個子shell的內容是更好的話,我提到PUSHD/POPD解決方案? 另外我需要根據當前處理的目錄中的文件/文件夾返回不同的退出代碼,所以在這種情況下,我應該使用導出還是類似的東西? 目前我想通過主題在這裏提到的每一個可能的方式,所以我在想,如果是更改目錄這裏提到或列出的完整路徑,並使用它作爲拉茲發佈 – skornos 2012-03-03 22:33:21

+0

我覺得拉茲的最佳解決方案解決方案好而且簡單;我不知道爲什麼我沒有自己提出建議。如果你打算做'cd',子彈往往是好的;如果你的shell無法回到它開始的地方(這可能發生,雖然權限需要非常奇怪),這是令人尷尬的。但是,它們使狀態處理複雜化;您需要退出具有適當狀態的子shell,然後將其捕獲到父shell('estatus = $?')中並決定如何處理它。捕獲很重要;如果你執行一個命令,'$?'中的狀態將會改變。用Raz的解決方案;我已經提出了它。 – 2012-03-03 22:51:33

1

echo "$str" | while read file ; do echo $file; done

0

已經有權利回答,這更是作爲獎金。當我遇到這個問題時,我通過'查找'打印文件名並將它們保存到文件中來解決它。之後,我從文件中逐行提取文件名。而且,許多shell命令可以用來自文件的數據輸入數據執行。