2012-02-04 214 views
6

我用下面的bash shell腳本列出的遞歸當前目錄下的名爲「.txt」文件的bash shell列表文件:使用「for」循環

#!/bin/bash 
for file in $(find . -type f -name "*.txt") 
do 
    echo $file 
    # Do something else. 
done 

然而,一些名爲「.txt」文件在當前目錄下有它們名字中的空格,例如「我的testing.txt」。列表被破壞,例如「我testing.txt」被列爲

my 
testing.txt 

看來,「for」循環使用「空白」(空格,\ n等)來分隔的文件列表,但在我來說,我只想用「\ n」分隔文件列表。

有沒有什麼辦法可以修改這個腳本來達到這個目的。任何想法。

在此先感謝。

+0

在bash中,我認爲你使用'find ... -print0'和'IFS =「\ 0」',或者其他。這個話題肯定還有其他的問題。 – 2012-02-04 07:34:24

回答

7

如果你正在使用bash 4,只使用一個水珠:

#!/bin/bash                  

shopt -s globstar 

for file in **/*.txt 
do 
    if [[ ! -f "$file" ]] 
    then 
     continue 
    fi 
    echo "$file" 
    # Do something else.               
done 

請務必註明"$file",否則你會在其他地方有同樣的問題。如果啓用了globstar**將遞歸匹配文件和目錄。

+0

謝謝。它適用於我的情況。 – user1129812 2012-02-04 08:24:47

7

是的,有find與NUL分隔的文件名,並使用read劃上NUL。這將成功迭代任何文件名,因爲NUL不是文件名的有效字符。

#!/bin/bash 
while IFS= read -r -d '' file; do 
    echo "$file" 
    # Do something else. 
done < <(find . -type f -name "*.txt" -print0) 

或者,如果# do something else是不是太複雜,你可以使用find-exec選項,而不必擔心正確界定

+0

謝謝。但是這種方法對我來說似乎不太熟悉。我會稍後再嘗試。 – user1129812 2012-02-04 08:17:06

+1

'find'的習慣使用就像這樣。 'for $(find ...)'中的文件的問題恰恰是它將以空格分割。相反,使用'find ... |同時讀文件'。爲了正確處理帶有換行符的文件名,需要使用「read」的附加選項,但是如果需要應對的只是空格,則可能會變得更加脆弱。 – tripleee 2012-02-04 10:52:25

+0

這種方法對我來說是一個很好的替代解決方案,因爲它允許任意允許的文件名。該方法現在已經過測試,並且適用於我的案例。 – user1129812 2012-02-04 15:03:24