【问题标题】:How to exclude a specific file in scp linux shell command?如何在 scp linux shell 命令中排除特定文件?
【发布时间】:2019-11-09 02:51:22
【问题描述】:

我正在尝试执行 scp 命令,使其可以将 .csv 文件从源复制到接收器,除了一些特定的 CSV 文件。

例如在源文件夹中我有四个文件:

file1.csv, file2.csv, file3.csv, file4.csv

在这四个文件中,我想将除 file4.csv 之外的所有文件复制到接收器位置。

当我使用下面的 scp 命令时:

scp /tmp/source/*.csv /tmp/sink/

它将所有四个 CSV 文件复制到接收器位置。

我怎样才能通过使用scp 命令或编写一个shell 脚本来达到同样的效果?

【问题讨论】:

  • 这个问题似乎更多地是关于scp 的命令行选项以及如何使用文件通配符。也许放在unix.stackexchange.com 会更好。

标签: linux bash shell scp


【解决方案1】:

您可以将rsync--exclude 开关一起使用,例如

rsync /tmp/source/*.csv /tmp/sink/ --exclude file4.csv

【讨论】:

  • 在这种情况下,我需要在服务器上安装 rsync。我们可以通过在 shell 脚本中包含 scp 来达到同样的效果吗?
  • rsync 现在通常预装在大多数 *nix 平台上 - 您是否检查过它是否在您的服务器上可用?
  • rsync 可以正常工作,但我正在寻找使用 scp 的解决方案。谢谢
【解决方案2】:

Bash 有一个extended globbing 功能可以做到这一点。在许多安装中,您必须单独启用此功能

shopt -e extglob

有了这些,你就可以

scp tmp/source/(!fnord*).csv /tmp/sink/

复制除fnord.csv 之外的所有*.csv 文件。

这是一个外壳功能; shell 会将 glob 扩展为匹配文件的列表 - scp 将不知道该参数列表是如何生成的。

【讨论】:

  • 如果源是外部主机,这将不起作用。
  • @Wiimm 看看我的解决方案来弥补这一点。
【解决方案3】:

正如您在comment 中提到的,rsync 不适合您。 tripleee 提出的解决方案仅在源位于客户端时才有效。在这里,我提出了一个使用sshtar 的解决方案。 tar 确实有 --exclude 标志,它允许我们排除模式:

从服务器到客户端:

$ ssh user@server 'tar -cf - --exclude "file4.csv" /path/to/dir/*csv' \
  | tar -xf - --transform='s#.*/##' -C /path/to/destination

这实际上创建了一个 tar-ball,它通过/dev/stdout 发送,我们通过管道将其发送到 tar 提取物中。为了模仿scp,我们需要使用--transform 删除完整路径(参见U&L)。您可以选择添加目标目录。

从客户端到服务器:

我们的做法基本相同,但角色互换:

$ tar -cf - --exclude "file4.csv" /path/to/dir/*csv \
  | ssh user@server 'tar -xf - --transform="s#.*/##" -C /path/to/destination'

【讨论】:

    【解决方案4】:

    您可以使用 bash 数组来收集较大的集合,然后删除您不想要的项目。例如:

    files=( /tmp/src/*.csv )
    for i in "${!files[@]}"; do
      [[ ${files[$i]} = *file4.csv ]] && unset files[$i]
    done
    scp "${files[@]}" host:/tmp/sink/
    

    请注意,我们的 for 循环遍历数组索引而不是值,因此如果需要,我们将获得 unset 命令的正确输入。

    【讨论】:

    • 感谢您的建议,但文件不在本地系统中。
    • @azad :但在你最初的尝试中,scp /tmp/source/*.csv /tmp/sink/,没有外国主机的概念!源和接收器都是本地的(/tmp),我想知道你为什么首先使用scp....
    • @azad,在您的问题中,它们位于本地文件系统上。此答案符合您的问题中指定的要求。也许您可以从作为源的主机运行它。否则,您需要告诉我们应该如何收集文件列表,因为您似乎发布了一个不完整的问题。
    猜你喜欢
    • 2016-05-28
    • 2017-08-25
    • 1970-01-01
    • 1970-01-01
    • 2015-06-14
    • 2017-10-28
    • 1970-01-01
    • 2010-12-15
    • 1970-01-01
    相关资源
    最近更新 更多