如何在scp linux shell命令中排除特定文件?

时间:2019-06-27 06:16:21

标签: linux bash shell scp

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

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

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

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

当我使用以下scp命令时:

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

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

如何通过使用scp命令或编写Shell脚本来实现相同的目的?

4 个答案:

答案 0 :(得分:5)

您可以通过--exclude开关使用rsync,例如

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

答案 1 :(得分:4)

Bash具有extended globbing功能,可实现此目的。在许多安装中,您必须分别通过以下方式启用此功能

case .ewalletData :
        return [K.APIParameterKey.token :"OP8JHOEOZ5KJW1X",K.APIParameterKey.fromMobile:"true",K.APIParameterKey.adminName:"binaryecom",K.APIParameterKey.limit:"100",K.APIParameterKey.offset:"0",K.APIParameterKey.userName:"OC6DGH"]

有了这个,您可以

shopt -e extglob

复制除scp tmp/source/(!fnord*).csv /tmp/sink/ 以外的所有*.csv个文件。

这是一个shell功能; shell将把glob扩展到匹配文件列表-fnord.csv不知道该参数列表是如何生成的。

答案 2 :(得分:1)

如您的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球,该球通过/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'

答案 3 :(得分: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命令提供正确的输入。