【问题标题】:Check if only one file exists with current data on bash检查 bash 上的当前数据是否仅存在一个文件
【发布时间】:2017-05-13 07:08:54
【问题描述】:

如何检查当前日期是否仅存在一个文件。 我有一个脚本:

name="nginx.log"
data=$(date +%Y.%m.%d)
current_nginx=$name.$data
cd /var/log/
for i in `ls "$name"*`; do
if [[ $i == "$current_nginx" ]]; then
    echo "only one file is exists"
else
    echo "other files is exists"
fi
done

我有文件:

ls -l /var/log/nginx.log*
-rw-r--r-- 1 root root  4814275 May 12 23:59 /var/log/nginx.log.2017.05.12.gz
-rw-r--r-- 1 root root 40468077 May 13 09:40 /var/log/nginx.log.2017.05.13

在脚本的结果中我有:

bash test.sh
other files is exists
only one file is exists

我有错误的地方。我重复。如果我只有一个当前日期的 nging.log,我想得到“只有一个文件存在”。如果我有更多 nginx.log.* 文件,我想得到消息“其他文件存在”。

【问题讨论】:

  • ls "$name"*?请阅读 cmets 至您的last question
  • 只有一个当前日期?这是否意味着您要检查是否没有其他日期(所有匹配 "$name."* 也匹配 "$name.$data"*),或者您要计算当前日期的文件(匹配 "$name.$data"* 的文件) )?

标签: linux bash shell for-loop if-statement


【解决方案1】:
for i in `ls "$name"*`; 

如果(任何)匹配该 glob 的条目是目录,这也会列出它们的内容。如果它们不是,或者您不想列出它们的内容,只需使用 for i in "$name"* ; -- 无论如何它都是扩展 glob 的 shell,ls 在这里没有任何用处。

您可以在 Bash 中计算与 glob 匹配的文件数量:

shopt -s nullglob
files=( "$name"* )
count=${#files[@]}              # take the count
for f in "${files[@]}" ; do     # or loop over them
    ...

【讨论】:

    【解决方案2】:

    对不起,我的第一个答案是垃圾。替换for循环:

    nfiles=$(ls "$name"* | wc -l)
    if [ $nfiles = 1 ]; then
        echo "only one file exists"
    else
        echo "$nfiles exist"
    fi
    

    wc -l 计算上一个命令输出中的行数。

    【讨论】:

    • 不错。但在这种情况下,我们计算所有文件。我只需要查看匹配 nginx.current_date
    • 对不起,我读得太快了。将ls "$name"* 更改为ls "$current_nginx"*
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-08-26
    • 1970-01-01
    • 1970-01-01
    • 2020-11-05
    • 2012-05-26
    • 1970-01-01
    • 2015-08-12
    相关资源
    最近更新 更多