在IF语句中组合多个子查询

时间:2015-04-01 21:45:54

标签: bash shell if-statement for-loop

当前目录包含不断出现的新日志  / tmp / logstash / dir包含我将比较新的日志

条件:
  如果新日志具有与/ tmp / logstash中已存在的相同的名称和大小,我应该得到相同的文件已存在'味精。
 否则,脚本会将新日志移动到/ tmp / logstash /.

注意,如果名称相同但大小不同,脚本仍应将新文件移至tmp / logstash /

我的脚本如下,并且它与组合'然后&&&&如果',你能帮忙解决一下吗?

for file in *.log; do
    new_filesize=$(du -b "$file" | cut -f 1)
    if [[ -e /tmp/logstash/"$file" ]]
    then
        old_filesize=$(du -b /tmp/logstash/"$file" | cut -f 1) &&
            if [[ "$new_filesize"="$old_filesize" ]]; then
                echo "The file already exists"
            fi
    else mv $file /tmp/logstash
    fi
done

2 个答案:

答案 0 :(得分:2)

条件表达式中=周围需要空格:

if [[ $new_filesize = $old_filesize ]]; then

没有空格,您只是测试连接字符串"$new_filesize"="$old_filesize"是否为非空。

答案 1 :(得分:1)

测试是否存在,如果是,则测试文件大小,否则复制

根据您的评论意见。以下测试是否存在old_file。如果是,则检查new_fileold_file之间的大小是否不同。如果它们不同,则会将new_file移至/tmp/logstash/,替换old_file。如果old_file存在并且文件大小相等,那么它将echo "The file already exists"。如果old_file不存在,则只需将new_file复制到/tmp/logstash/

for file in *.log; do
    if [ -e /tmp/logstash/"$file" ]; then
        if [ $(stat %s "$file") -ne $(stat %s /tmp/logstash/"$file") ]
            mv -f "$file" /tmp/logstash
        else
            echo "The file already exists"
        fi
    else
        cp "$file" /tmp/logstash/"$file"
    fi
done

注意:请记住引用您的变量


使用变量new_filesizeold_filesize

for file in *.log; do
    new_filesize=$(stat %s "$file")
    if [ -e /tmp/logstash/"$file" ]; then
        old_filesize=$(stat %s /tmp/logstash/"$file")
        if [ $new_filesize -ne $old_filesize ]
            mv -f "$file" /tmp/logstash
        else
            echo "The file already exists"
        fi
    else
        cp "$file" /tmp/logstash/"$file"
    fi
done

注意: mv -f已添加到old_file存在的所有情况,以防止因现有文件导致移动失败。