2013-10-07 34 views
3
#!/bin/bash 
outbound=/home/user/outbound/ 
putfile=DATA_FILE_PUT_*.CSV 
cd $outbound 
filecnt=0 
for file in $putfile; do let filecnt=filecnt+1; done 
echo "Filecount: " $filecnt 

因此,當出站目錄中有文件時,此代碼運行良好。我可以將文件放入出站路徑,只要它們與putfile掩碼匹配,文件就會按預期遞增。bash:變量中帶有通配符的文件名

問題出在哪裏,如果我在沒有文件位於$outbound的情況下運行這個。 如果有零個文件那麼$filecnt仍然會返回一個1但我希望它返回0如果沒有文件那裏。

我是否缺少一些簡單的東西?

回答

3

set -x就在#!的下方,觀看你的腳本在做什麼。

如果沒有匹配的文件,則通配符保持不擴展,並且循環運行一次,其中file的值爲DATA_FILE_PUT_*.CSV

要改變這種情況,請設置nullglob選項。請注意,這隻適用於bash,而不適用於sh。

shopt -s nullglob 
putfile=DATA_FILE_PUT_*.CSV 
for file in $putfile; do let filecnt=filecnt+1; done 

注意,putfile變量包含通配符模式,而不是文件名的列表。將匹配列表放入變量中可能更有意義。這需要是一個數組變量,並且您需要先更改當前目錄。匹配文件的數量就是數組的長度。

#!/bin/bash 
shopt -s nullglob 
outbound=/home/user/outbound/ 
cd "$outbound" 
putfiles=(DATA_FILE_PUT_*.CSV) 
echo "Filecount: " ${#putfiles} 

如果你需要遍歷文件,注意保護用雙引號陣列的擴張,否則,如果文件名包含空格,然後它會在幾個單詞拆分(如果文件名中包含通配符,它​​們將被擴展)。

#!/bin/bash 
shopt -s nullglob 
outbound=/home/user/outbound/ 
cd "$outbound" 
putfiles=(DATA_FILE_PUT_*.CSV) 
for file in "${putfiles[@]}"; do 
    echo "Processing $file" 
done 
0

不確定爲什麼你需要一段代碼。以下班輪應該做你的工作。

ls ${outbound}/${putfile} | wc -l 

或者

find ${outbound} -maxdepth 1 -type f -name "${putfile}" | wc -l 
+0

請注意,如果存在包含換行符(通常不會發生,但可能是健壯性或安全問題)的文件名,則此功能無效。 – Gilles

+0

@Gilles感謝您的反饋。同意你'ls'可能導致這樣的問題。那麼我寧願'find'然後''wc'。我相信'find'足夠強大。糾正我,如果我錯了 – jkshah

+2

這是同樣的問題:'find'是健壯的,但然後'wc -l'仍然會計數行而不是文件名。你可以使用'find ... -print0 | tr -dc'\ 0'| wc -c',但在bash內部進行計數更容易。從'find'開始計數將會遍歷子目錄(如果有的話),這不在原始需求中。 – Gilles

1

文件是否存在第一

for file in $putfile; do 
    if [ -f "$file" ] ; then 
    let filecnt=filecnt+1 
    fi 
done 

或者你可以測試一下與你的文件找到

for file in $(find . -type f -name="$putfile"); do 
    let filecnt=filecnt+1 
done 

或者乾脆(固定)

filecnt=$(find . -type f -name "$putfile" | wc -l); echo $filecnt 
+1

請注意,如果文件名可能包含空格或任何'\ [?*',因爲輸出被視爲通配符模式列表,所以解析'find'的輸出不起作用。最後一個命令根本不起作用,因爲它試圖執行'let'作爲外部命令。 – Gilles

+0

感謝您指出錯誤 –

1

這是因爲當沒有找到匹配,bash的默認擴展通配符DATA_FILE_PUT_*.CSV這個詞DATA_FILE_PUT_*.CSV,所以你最終的1 計數要禁用此行爲,使用shopt -s nullglob

相關問題