我有一个具有以下结构的测试文件夹:
"driveA"
- "bar - foo"
- "fileBarFooA"
- "fileBarFooB"
- "fileA"
- "fileB"
- "fileC"
- "folder.A"
- "fileAA"
- "fileAB"
- "folderB"
- "fileBA"
- "fileBB"
在 bash shell 中,我想将驱动器 A 的内容同步到驱动器 B(文件夹“folder.A”除外),以获得如下所示的结果副本:
"driveB"
- "bar - foo"
- "fileBarFooA"
- "fileBarFooB"
- "fileA"
- "fileB"
- "fileC"
- "folderB"
- "fileBA"
- "fileBB"
乍一看,实现此目的的一种方法是在 DriveA 上提供经过过滤的 ls 作为 rsync 的参数:
rsync -aR -- `ls -F | grep [^folder.A/]` ../driveB
这会导致错误并且无法完成:
问题是文件夹“bar - foo”没有被复制。查看错误,我们发现一个问题是我们正在提供ls -F
文件名和文件夹的非转义输出:
:driveA$ ls -F
bar - foo/
fileA
fileB
fileC
folder.A/
folderB/
我还没有找到让它输出转义字符的选项ls
,所以接下来要尝试的是后处理sed
- 一种方法是添加转义字符:
:driveA vgani$ ls -F | sed 's/\ /\\\ /g' | grep [^folder.A/]
bar\ -\ foo/
fileA
fileB
fileC
folderB/
与此同步给出:
:driveA $ rsync -aR `ls -F | sed 's/\ /\\\ /g' | grep [^folder.A/]` ../driveB
rsync: -\: unknown option
rsync error: syntax or usage error (code 1) at /BuildRoot/Library/Caches/com.apple.xbs/Sources/rsync/rsync-51/rsync/main.c(1337) [client=2.6.9]
哦不,一个错误(而且是 1337 错误!)这只是由于 rsync 将-\
文件夹的一部分作为命令行参数,所以我们可以通过添加来修复这个问题--
:
driveA $ rsync -aR -- `ls -F | sed 's/\ /\\\ /g' | grep [^folder.A/]` ../driveB
因此,它看起来与不添加转义字符的结果相同。
另一个后处理想法是尝试添加引号:
:driveA $ ls -F | sed 's/^/"/g' | sed 's/[^/]$/"/g' | sed 's/\//"\//g'
"bar - foo"/
"file"
"file"
"file"
"folder.A"/
"folderB"/
但这会导致 rsync 将引号视为文字字符并且不复制任何内容:
:driveA $ rsync -aR -- `ls -F | sed 's/^/"/g' | sed 's/[^/]$/"/g' | sed 's/\//"\//g' | grep [^\"folder.A\"/]` ../driveB
rsync: link_stat "/driveA/"bar" failed: No such file or directory (2)
rsync: link_stat "/driveA/-" failed: No such file or directory (2)
rsync: link_stat "/driveA/foo"/" failed: No such file or directory (2)
rsync: link_stat "/driveA/"file"" failed: No such file or directory (2)
rsync: link_stat "/driveA/"file"" failed: No such file or directory (2)
rsync: link_stat "/driveA/"file"" failed: No such file or directory (2)
rsync: link_stat "/driveA/"folderB"/" failed: No such file or directory (2)
rsync error: some files could not be transferred (code 23) at /BuildRoot/Library/Caches/com.apple.xbs/Sources/rsync/rsync-51/rsync/main.c(996) [sender=2.6.9]
到目前为止,我很困惑,有没有一种方法可以在不被连字符字符窒息的情况下 提供rsync
内容?ls
答案1
Rsync 有一个exclude
选项。您应该能够通过以下方式实现这一目标:
cd /path/to/driveA
rsync -avWxP --exclude=folder.A . /path/to/driveB/