Bash 脚本备份,检查目录是否包含来自另一个目录的文件

时间:2021-02-08 22:13:14

标签: bash

我正在制作一个 bash 备份脚本,我想实现一个功能来检查一个目录中的文件是否已经包含在另一个目录中,如果不是我想输出这些文件的名称

#!/bin/bash

TARGET_DIR=$1
INITIAL_DIR=$2
TARG_ls=$(ls -A $1)
INIT_ls=$(ls -A $2)

if [[ "$(ls -A $2)" ]]; then
        if [[ ! -n "$(${TARG_ls} | grep ${INIT_ls})" ]]; then
                echo All files in ${INITIAL_DIR} have backups for today in ${TARGET_DIR}
                exit 0
        else 
                #code for listing the missing files
        fi
else
        echo Error!! ${INITIAL_DIR} has no files
        exit 1
fi

我曾考虑将两个目录的 ls 输出存储在字符串中并比较它们,如代码中所示,但如果我必须列出 TARGET_DIR 中缺少的 INITIAL_DIR 文件,我只是不不知道如何继续。

我尝试使用 diff 命令比较两个目录,但考虑到 TARGET_DIR 的预先存在的文件。

在上面的代码中, if [[ "$(ls -A $2)" ]]; 检查 CURRENT_DIR 是否包含任何文件,if [[ ! -n "$(${TARG_ls} | grep ${INIT_ls})" ]]; 检查目标目录是否包含所有初始目录文件。

有人有什么建议,提示吗?

2 个答案:

答案 0 :(得分:1)

您可以使用 comm 命令

$ comm <(ls -A a) <(ls -A b)

将仅提供 a 中的文件,a 和 b 中的文件,以及三列中仅 b 中的文件。仅以获取文件列表为例

$ comm -23 <(ls -A a) <(ls -A b)

答案 1 :(得分:0)

rsync 有一个 --dry-run 开关,它会告诉你哪些文件在 2 个目录之间发生了变化。在对我的主目录执行 rsync 副本之前,我会以这种方式预览更改,以查看在继续之前是否可能存在大规模恶意加密或损坏的证据。