2013-04-20 90 views
2

我有這個慶典「爲」環,看起來對PDF文件的目錄,並促使他們(簡化的例子)猛砸了,當沒有文件發現

#!/bin/bash 
for pic in "$INPUT"/*.pdf 
do 
    echo "found: ${pic}" 
done 

這個腳本作品執行錯誤以及當有$輸入目錄中的PDF文件,但是,當有目錄中沒有的PDF文件,我得到:

發現:/home/.../input-folder/*.pdf

是否是預期的行爲? 我該如何處理for for循環? 我是否需要使用ls或找到?

我試着用「$ INPUT」左右引號。文件名稱和目錄名稱中沒有空格。

非常感謝您的意見。

+0

參見[枚舉文件或做的東西與文件](http://mywiki.wooledge.org/ParsingLs#Enumerating_files_or_doing_stuff_with_files)。 – 2013-04-20 08:43:49

回答

6

這是預期的行爲。按照bash man page,在路徑名擴展部分:

字分開後,除非-f選項已被設置時,bash搜索每個字的字符*,和[?如果出現這些字符中的一個,則將該字視爲模式,並用符合該模式的按字母順序排列的文件名列表替換。 如果找不到匹配的文件名,並且shell選項nullglob未啓用,則該字保持不變。

因此,如果找不到"$INPUT"/*.pdf的匹配項,循環將在模式本身上執行。但是在手冊頁的下一句中:

如果設置了nullglob選項,並且找不到匹配項,則會刪除該詞。

這就是你想要的!所以只是做:

#!/bin/bash 
shopt -s nullglob 
for pic in "$INPUT"/*.pdf 
do 
    echo "found: ${pic}" 
done 

(但要注意,這可能會改變在意想不到的方式與其他事物的行爲,例如,嘗試運行shopt -s nullglob; ls *.unmatchedextension看看會發生什麼。)

1

我只想補充文件存在的測試是這樣的:

#!/bin/bash 
if test -e `echo "$INPUT"/*.pdf | cut -d' ' -f1` 
then 
    for pic in "$INPUT"/*.pdf 
    do 
     echo "found: ${pic}" 
    done 
fi 
+0

如果'「$ INPUT」/ *。pdf'匹配多個文件(參數太多),'test'命令可能會失敗。 – chepner 2013-04-21 01:57:13

+0

你是對的 - 回答更正 – parkydr 2013-04-21 07:48:47

+0

更接近,但如果產生的第一個文件名包含一個空格,'test'仍然可能失敗; 'cut'將輸出一個部分路徑,而不是整個路徑。 – chepner 2013-04-22 12:39:20