AskOverflow.Dev

AskOverflow.Dev Logo AskOverflow.Dev Logo

AskOverflow.Dev Navigation

  • 主页
  • 系统&网络
  • Ubuntu
  • Unix
  • DBA
  • Computer
  • Coding
  • LangChain

Mobile menu

Close
  • 主页
  • 系统&网络
    • 最新
    • 热门
    • 标签
  • Ubuntu
    • 最新
    • 热门
    • 标签
  • Unix
    • 最新
    • 标签
  • DBA
    • 最新
    • 标签
  • Computer
    • 最新
    • 标签
  • Coding
    • 最新
    • 标签
主页 / server / 问题 / 505802
Accepted
rjt
rjt
Asked: 2013-05-08 13:22:43 +0800 CST2013-05-08 13:22:43 +0800 CST 2013-05-08 13:22:43 +0800 CST

rsync 不删除字符串数组周围的单引号 --filter 列表

  • 772

试图从我们收购的受到严重感染的 Windows XP 和 2003 计算机中安全地检索文件。我也有类似的需求,需要自动执行一个脚本,该脚本将在 PXE 引导的 DRBL 机器上运行以 rsync 到我们的服务器。

以下代码导致单引号将整个 '--filter=''' 参数包裹到 rsync。注意 echo 去掉了单引号,但 rsync 没有。我究竟做错了什么?将每个参数都作为数组中的一个条目会有帮助吗?


失败,因为包装单引号:

'--filter='\''- "Default User/"'\''  --filter='\''- "Application Data/"'\'' '


当我运行完全相同的命令但手动删除包装单引号时,rsync 运行良好。
作品:

--filter='\''- "Default User/"'\''  --filter='\''- "Application Data/"'\'' 

尝试过不使用和不使用 --protect-args。


#!/bin/sh -x

PROTECTARGS=--protect-args
EXCLUDE=( '- "Default User/"' '- "Application Data/"' )
echo EXCLUDE="${EXCLUDE[*]}" 
FILTER=()
for X in "${EXCLUDE[@]}"; do
  FILTER=( "${FILTER[@]}" "--filter='${X}' " );
done;
echo FILTER="${FILTER[*]}"

if [ "1" == "1" ]; then
rsync --dry-run -vv --stats \
      --recursive \
      "$PROTECTARGS"  \
      "${FILTER[*]}"  \
      '/hddOld/Documents and Settings' \
      '/hddNew/'
fi;

输出:


FILTER=--filter='- "Default User/"'  --filter='- "Application Data/"' 
+ '[' 1 == 1 ']'
+ rsync --dry-run -vv --stats --recursive --protect-args '--filter='\''- "Default User/"'\''  --filter='\''- "Application Data/"'\'' ' '/hddOld/Documents and Settings' /hddNew/
Unknown filter rule: `'- "Default User/"'  --filter='- "Application Data/"' '
rsync error: syntax or usage error (code 1) at exclude.c(817) [client=3.0.6]




bash-4.1.2-14.el6.x86_64
rsync  version 3.0.6  protocol version 30
rsync-3.0.6-9.el6.x86_64
CentOS 6.4 x64

工作......不,它不:


FILTER+=( --filter=""${X}""  );

RESULTS IN:
'--filter=- "Default User/" --filter=- "Application Data/"'  

rsync 并没有抱怨这个过滤规则,但实际上并没有过滤掉“Application Data/”。

bash
  • 2 2 个回答
  • 2386 Views

2 个回答

  • Voted
  1. DerfK
    2013-05-08T16:30:40+08:002013-05-08T16:30:40+08:00

    你有两个问题:

    首先,不要在其中使用引号--filter(尤其--protect-args是说使用它来避免必须转义空格,尽管我在这里的测试表明双引号在没有它的情况下也是按字面意思使用的)。过滤器应该是- Application Data/. 正如您用引号编写的那样,它正在寻找名为"文件夹中的文件"Application Data

    另一个问题是您希望每个过滤器都是一个单独的参数,因此在命令中rsync使用@而不是:*

    rsync --dry-run -vv --stats \
          --recursive \
          "$PROTECTARGS"  \
          "${FILTER[@]}"  \
          '/hddOld/Documents and Settings' \
          '/hddNew/'
    

    测试:

    GNU bash, version 4.1.5(1)-release (x86_64-pc-linux-gnu)
    rsync version 3.0.7 protocol version 30

    我创建了一个数组arr=(a b "c d"),然后用来touch "${arr[@]}"创建文件

    a
    b
    c d
    

    在dir1。

    rsync -r --filter='- c d' dir1/ dir2
    

    复制到. a_bdir2

    rsync -r --filter='- "c d"' dir1/ dir3
    

    复制所有文件,因为 rsync 正在寻找文件名"c d"中带有引号的文件。还测试了使用mkdirand- c d/以- "c d/"确保目录过滤器没有不同的工作方式,并且"c d/"在排除目录的同时不排除目录c d/。

    • 1
  2. Best Answer
    jay
    2013-05-08T19:47:42+08:002013-05-08T19:47:42+08:00

    我通过这样做让它工作:

    我变了:

    EXCLUDE=( '- "Default User/"' '- "Application Data/"' )
    

    至

    EXCLUDE=( '-_Default User/' '-_Application Data/' )
    

    这删除了双引号并在“-”之后使用了备用下划线“_”语法。先前的回答表明了这一点,但我必须添加“_”语法才能让它为我工作。

    也改变了:

    FILTER=( "${FILTER[@]}" "--filter='${X}' " );
    

    至

    FILTER=( "${FILTER[@]}" "--filter=${X}" );
    

    这从 X 变量替换周围删除了撇号。

    并改变了:

    "${FILTER[*]}"
    

    至

    "${FILTER[@]}"
    

    这导致数组的每个元素都被视为单个参数,而不是前面提到的整个数组。

    • 1

相关问题

  • Mac OS X:从 python 脚本中更改 $PATH

  • Bash 脚本:要求脚本以 root 身份运行(或使用 sudo)

  • crontab ifconfig 什么都不输出

  • 使用命令行工具按排序顺序计算重复项

  • 是否有 bash 等效于 ruby​​ 的“一些内容#{foo}”?

Sidebar

Stats

  • 问题 205573
  • 回答 270741
  • 最佳答案 135370
  • 用户 68524
  • 热门
  • 回答
  • Marko Smith

    新安装后 postgres 的默认超级用户用户名/密码是什么?

    • 5 个回答
  • Marko Smith

    SFTP 使用什么端口?

    • 6 个回答
  • Marko Smith

    命令行列出 Windows Active Directory 组中的用户?

    • 9 个回答
  • Marko Smith

    什么是 Pem 文件,它与其他 OpenSSL 生成的密钥文件格式有何不同?

    • 3 个回答
  • Marko Smith

    如何确定bash变量是否为空?

    • 15 个回答
  • Martin Hope
    Tom Feiner 如何按大小对 du -h 输出进行排序 2009-02-26 05:42:42 +0800 CST
  • Martin Hope
    Noah Goodrich 什么是 Pem 文件,它与其他 OpenSSL 生成的密钥文件格式有何不同? 2009-05-19 18:24:42 +0800 CST
  • Martin Hope
    Brent 如何确定bash变量是否为空? 2009-05-13 09:54:48 +0800 CST
  • Martin Hope
    cletus 您如何找到在 Windows 中打开文件的进程? 2009-05-01 16:47:16 +0800 CST

热门标签

linux nginx windows networking ubuntu domain-name-system amazon-web-services active-directory apache-2.4 ssh

Explore

  • 主页
  • 问题
    • 最新
    • 热门
  • 标签
  • 帮助

Footer

AskOverflow.Dev

关于我们

  • 关于我们
  • 联系我们

Legal Stuff

  • Privacy Policy

Language

  • Pt
  • Server
  • Unix

© 2023 AskOverflow.DEV All Rights Reserve