我错过了什么?
我想找出目录中有多少文件与给定模式匹配并将其分配给变量。
如果我直接在命令行上输入它,它工作正常
ls /backups/system\ db\ files/temp/daily/backup_filename_202203*.tar.gz | wc -l
(nb*
是创建备份的日期,例如01
,02
等03
)
但是一旦我将它添加到我的 bash 脚本中,它就会失败。
到目前为止,我有:
base_dir="/backups/system\ db\ files/temp"
sub_dir="${base_dir}/daily"
filename_base="backup_filename_"
然后我尝试运行:
counter=$(ls ${sub_dir}/${filename_base_}202203*.tar.gz | wc -l)
或带引号:
counter=$(ls "${sub_dir}/${filename_base_}202203*.tar.gz" | wc -l)
第一个失败,因为它试图根据空格分割它。第二个不扩展*
查找通配符。
我试过只是引用其中的一些,例如
counter=$(ls "${sub_dir}/${filename_base_}"202203*.tar.gz | wc -l)
但它再次忽略了通配符。
我一直在搜索,但我一生都找不到获得匹配文件总数的方法。
你的问题是你的目录没有被调用
/backups/system\ db\ files/temp
,它被调用了backups/system db files/temp
。当您引用字符串时,您使反斜杠成为字符串的一部分。由于您引用了字符串,因此无需转义空格。您在几个地方也有错误的变量拼写filename_base
(带有尾随下划线)。您也不需要使用
ls
andwc
来计算与 shell 模式匹配的名称的数量。请记住,文件名的名称中可以包含换行符,并且wc -l
计算换行符,而不是文件名。要查看一个 shell 模式有多少匹配项,您需要做的就是将该模式扩展为一个数组或位置参数列表,然后查看该数组或列表的长度。
使用带有示例模式的数组:
使用位置参数列表:
在
bash
shell 中,您必须设置nullglob
shell 选项 usingshopt -s nullglob
以正确处理空目录(如果不匹配任何内容,该模式通常不展开)。如果没有设置
nullglob
,您可以改为测试是否没有匹配项或者,如果您使用位置参数,
如果结果列表中的第一个元素的否定
-e
和-h
测试为真,则第一个元素不是现有文件,也不是损坏的符号链接。这意味着该模式没有匹配项。当您已经引用它们时,您不会转义空格,否则反斜杠将按字面意思表示:
应该
还有你为什么
_
在${filename_base_}
里面?如果其他一切都正确,您的最后一个命令应该可以工作:
无论如何,你不应该解析
ls
.而是使用
find
:或数组:
您需要该
nullglob
选项,否则结果将是1
如果没有文件与您的模式匹配,则字符串将按字面意思进行。