我正在尝试执行scp
命令,以便它可以将.csv文件从源复制到接收器,除了一些特定的CSV文件之外。
例如,在源文件夹中,我有四个文件:
file1.csv, file2.csv, file3.csv, file4.csv
在这四个文件中,我想将除file4.csv以外的所有文件复制到接收器位置。
当我使用以下scp命令时:
scp /tmp/source/*.csv /tmp/sink/
它将所有四个CSV文件复制到接收器位置。
如何通过使用scp
命令或编写Shell脚本来实现相同的目的?
答案 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提出的解决方案仅在源位于客户端时才有效。在这里,我提出了一个使用ssh
和tar
的解决方案。 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
命令提供正确的输入。