rsync 在目录之间删除

rsync 在目录之间删除

我正在尝试创建一个 rsync 命令,该命令可以排除目录而不影响其内容,从而有效地将它们向上移动 1 个目录。在下面的例子中,我想递归地排除目录 A 和 B,C 目录也将被排除,但其内容将移动到上面的目录中。使用 rsync 可以做到这一点吗?

来源

/ORIGINAL
├── 1
│   ├── A
│   ├── B
│   └── C
│       ├── i
│       ├── ii
│       └── iii
├── 2
│   ├── A
│   ├── B
│   └── C
│       ├── i
│       ├── ii
│       └── iii
└── 3
    ├── A
    ├── B
    └── C
        ├── i
        ├── ii
        └── iii

目的地

/BACKUP
├── 1
│   ├── i
│   ├── ii
│   └── iii
├── 2
│   ├── i
│   ├── ii
│   └── iii
└── 3
    ├── i
    ├── ii
    └── iii

下面的命令是我希望能够起作用的,但是我认为我的包含步骤不正确或功能错误,无法实现我想要实现的目标。有人能给我指出正确的方向吗?

rsync  -avhW --progress --delete \
--include C/ \
--exclude A \
--exclude B \
--exclude C \ 
"/Users/harry/Desktop/ORIGINAL/" \ 
"/Users/harry/Desktop/BACKUP"

答案1

您不能直接使用 来执行此操作rsync,因此您需要一些支持性粘合剂。等您找到编写此代码的最佳方法时,您不妨避免使用rsync并以不同的方式执行此操作。

我假设虽然您似乎正在使用 Windows 文件系统,但您可以访问 UNIX/Linux 风格的 shell 和相关实用程序。

base='/Users/harry/Desktop'

for src in "$base/ORIGINAL"/*/C/     # All C directories under …/ORIGINAL
do
    src="${src%/C/}"                 # Strip trailing /C/
    dst="$base/BACKUP/${src##*/}"    # Derive the corresponding destination
    mkdir -p "$dst"                  # Create destination directory if necessary
    cp -Rp "$src/C"/* "$dst/"        # Copy source files
done

如果您想查看未发生任何操作时发生的情况,请在两者前面加上前缀 和 。采用这种方法,以下是使用的潜在mkdir运行:cpechobase=/tmp

mkdir -p /tmp/BACKUP/1
cp -Rp /tmp/ORIGINAL/1/C/i /tmp/ORIGINAL/1/C/ii /tmp/ORIGINAL/1/C/iii /tmp/BACKUP/1/
mkdir -p /tmp/BACKUP/2
cp -Rp /tmp/ORIGINAL/2/C/i /tmp/ORIGINAL/2/C/ii /tmp/ORIGINAL/2/C/iii /tmp/BACKUP/2/
mkdir -p /tmp/BACKUP/3
cp -Rp /tmp/ORIGINAL/3/C/i /tmp/ORIGINAL/3/C/ii /tmp/ORIGINAL/3/C/iii /tmp/BACKUP/3/

相关内容