如何在SCP Linux Shell命令中排除特定文件?

3
我可以为您进行中文翻译,这段内容与IT技术相关。将“Original Answer”翻译成“最初的回答”,并且润色原文以使其更加通俗易懂。请注意保留HTML标签,并按照格式要求仅返回翻译结果。以下是需要翻译的内容:

我正在尝试执行scp命令,以便它可以从源复制.csv文件到目标,但排除一些特定的CSV文件。

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

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

最初的回答:从这四个文件中,我想要复制除了file4.csv之外的所有文件到目标位置。
当我使用下面的scp命令时:
scp /tmp/source/*.csv /tmp/sink/

它会将所有四个CSV文件复制到汇聚位置。 通过使用scp命令或编写shell脚本,我该如何实现相同的功能?最初的回答。

2
这个问题似乎更多关于scp命令行选项以及如何使用文件通配符的内容。或许把它放在https://unix.stackexchange.com/上会更合适。 - Graham
4个回答

6

您可以使用带有--exclude开关的rsync命令,例如:

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

在这种情况下,我需要在服务器上安装rsync。我们能否通过在shell脚本中包含scp来实现相同的功能? - azad
现在,rsync通常预装在大多数*nix平台上。你检查一下服务器上是否可用了吗? - Paul R
rsync会很好用,但我正在寻找使用scp的解决方案。谢谢。 - azad

4

Bash有一个扩展通配符功能,可以实现这一点。在许多安装中,您需要单独启用此功能:

shopt -e extglob

有了那个,你可以

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

复制所有*.csv文件,除了fnord.csv

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


2
如果源主机是外国主机,这将无法工作。 - Wiimm
@Wiimm请看一下我对此进行补偿的解决方案。 - kvantour

1
作为你 评论 中提到的,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包,将其发送到/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'

0
你可以使用一个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
2
@azad :但在你的原始尝试中,scp /tmp/source/*.csv /tmp/sink/,并没有外部主机的概念!源和目标都是本地的(/tmp),我想知道你为什么首先使用了scp.... - user1934428
@azad,在你的问题中,它们是在本地文件系统上。这个答案符合你问题中指定的要求。也许你可以从作为源的主机上运行这个。否则,你需要告诉我们如何收集文件列表,因为你似乎发布了一个不完整的问题。 - ghoti

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接