Rsync 目录过滤文件并保留边缘情况(例如带连字符 (-) 的名称)

Rsync 目录过滤文件并保留边缘情况(例如带连字符 (-) 的名称)

我有一个具有以下结构的测试文件夹:

"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

这会导致错误并且无法完成:

过滤 rsync 第一种方法错误

问题是文件夹“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/

相关内容