检查文件是否存在于3个不同的目录中,并将它们一个移到另一个

时间:2019-02-08 15:57:22

标签: shell

我在创建shell脚本方面还很陌生。

我正在开发一个Shell脚本,该脚本每天仅备份一次我的文件。 我需要检查* .war文件是否位于三个不同的文件夹(输入文件夹,生产文件夹,备份文件夹)中

如果三个目录中存在相同的文件,请不要执行备份。 如果没有,则必须将文件夹2中的文件移动到文件夹3。

这是我到目前为止所做的。

==============================

TODAY=$(date +%d-%m-%Y)
INPUT=/home/bruno.ogasawara/entrada/
BACKUP=/home/bruno.ogasawara/backup/
PROD=/home/bruno.ogasawara/producao/
DIR1=$(ls $INPUT)
DIR2=$(ls $PROD)
DIR3=$(ls $BACKUP$TODAY)

for i in $DIR1; do
    for j in $DIR2; do
        for k in $DIR3; do
                if [ $i == $j ] && [ $j == $k ]; then
                          exit 1; else
                          mv -f $PROD$j $BACKUP$TODAY
                fi
        done
    done
done

mv -f $INPUT*.war $PROD

==============================

验证不起作用。最后,只有mv -f $ INPUT * .war $ PROD起作用。 我在哪里缺少某些东西或做错了什么?

先谢谢大家。

1 个答案:

答案 0 :(得分:0)

我了解的是您要同步这三个文件夹。

在这种情况下,您不应该修改文件名,因为我们使用文件名进行比较。否则,您应该使用md5或sha校验和。但是linux文件系统已经具有时间戳功能,您不必在文件名上附加日期。

在您的代码中,您使用ls列出了文件...但是实际上ls命令以列模式列出了文件,这与bash中的for循环不兼容。
正确的命令是

  

找到$ DIR -maxdepth 1 -type f -exec basename {} \;

您要将* .war文件同步到所有文件夹...然后可以简单地使用它:

#!/bin/bash
DIR1=/home/bruno.ogasawara/entrada/
DIR2=/home/bruno.ogasawara/backup/
DIR3=/home/bruno.ogasawara/producao/

cp -n $DIR1/*.war $DIR2
cp -n $DIR1/*.war $DIR3
cp -n $DIR2/*.war $DIR1
cp -n $DIR2/*.war $DIR3
cp -n $DIR3/*.war $DIR1
cp -n $DIR3/*.war $DIR2
  

-n:将检查文件是否已存在。不会覆盖现有文件。