我正在尝试创建一个 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
运行:cp
echo
base=/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/