2013-10-07 31 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

相关问题