Bash脚本计算文件数量


11

我有一个脚本,如果文件存在或不存在,我想显示不同的消息。我有一个像这样的脚本:

count=ls /import/*.zip | wc -l

echo "Number of files: " $count
if [ "$count" > "0" ]; then
    echo "Import $count files"
else
    echo "**** No files found ****"
fi

但是,如果不存在文件,则显示的No such file or directory不是0个文件。目录中有一个目录/import/,所以我不能只执行ls命令,因为它总是返回大于0的值。

如何计算特定扩展名(.zip,.gz等)的文件数,并在bash脚本中使用该值来显示文件数,然后在if语句中使用它显示不同的消息?

Answers:


15

count=$(find /import -maxdepth 1 -name '*.zip' | wc -l)


1
我添加了-maxdepth 1以仅对当前目录中的文件进行计数
Wallace Sean

1
如果在当前目录中调用任何.zip文件时,您可能想引用'* .zip',在这种情况下,外壳程序会为您扩展* .zip,同时您希望它通过它来查找。 (1)。
Phil P

4

试试这个:

count=$(find /import/ -maxdepth 1 -type f -name '*.zip' | wc -l)
...
if [ $count -gt 0 ] ; then
  ...
else
  ...
fi

这个想法是通过将发送到位存储桶的“没有这样的文件”错误隐藏到STDERR中,并使用适当的测试功能来比较数字。(-gt代表“大于”。还有-eq-lt-ge等)


或者,您也可以这样做count=$(find /import -type f -name "*.zip" | wc -l)
slillibri 2011年

当然,但这与只有ls /import/*.zip子目录具有不同的含义
Mat

我设置了maxdepth以避免计数子目录中的文件,并将脚本更新为使用-gt。感谢您的帮助
Wallace Sean

如果目录中的文件太多而无法容纳argv以进行ls调用,则此操作将失败。
Phil P

嗯对 更正了一个find变体。
Mat

0

我尝试了您的脚本,并且正如预期的那样,当没有文件匹配时,它的确在输出显示了0个文件,但也显示了ls之前的错误。解决这个问题很容易,不需要沟渠ls。只需用以下内容替换第一行:

count=$(ls /import/*.zip 2>/dev/null| wc -l)

2>/dev/null将stderr重定向到/dev/null,以禁止显示错误消息。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.