如何将目录中的所有文件复制到没有目录的远程?

如何将目录中的所有文件复制到没有目录的远程?

我想使用 scp 将.目录中的所有文件(包括“隐藏”文件)复制output到远程目录。欢迎使用其他方法,但 除外。不幸的是,托管服务提供商不允许安装它。targetrsync

我查找了几种解决方案但似乎比我预想的要难。


scp -P 22 -r path/to/output/ "$USER@$HOST:/path/target/"

scp -P 22 -r path/to/output "$USER@$HOST:/path/target/"

放置文件/path/target/output/或者需要重命名。


scp -P 22 -r path/to/output/* "$USER@$HOST:/path/target/"

这与隐藏文件不匹配。


scp -P 22 -r path/to/output/. "$USER@$HOST:/path/target/"

这不再有效(详细信息见评论https://unix.stackexchange.com/a/232947)。


scp -P 22 -r path/to/output/{,.[!.],..?}* "$USER@$HOST:/path/target/"

如果不是所有的模式都匹配(例如缺少.<filename>.


我正在寻找一种方法来复制全部目录内容递归复制到远程目录。我有 SSH 或 FTP 访问权限。额外好处是在复制之前清理目标目录。

编辑:留下尾部斜线target没有影响

答案1

您可以使用 bash 的 nullglob 选项跳过不匹配的通配符:

shopt -s nullglob
scp -P 22 -r path/to/output/{,.[!.],..?}* "$USER@$HOST:/path/target/"
shopt -u nullglob    # Put it back to normal afterward!

这样做的一个可能问题是,如果目录完全为空(即,没有任何通配符分支匹配任何内容),则整个参数会消失并scp发出警告,因为您没有为其提供源和目标。如果可能的话,请将文件列表存储在数组中并首先检查内容:

shopt -s nullglob
filesToSend=( path/to/output/{,.[!.],..?}* )
shopt -u nullglob    # Put it back to normal afterward!
if (( ${#filesToSend[@]} > 0 )); then
    scp -P 22 -r "${filesToSend[@]}" "$USER@$HOST:/path/target/"
else
    echo "No files in source directory" >&2
fi

答案2

我正在使用找到的解决方案这里使用sshtar

tar -C path/to/output/ -cf - . | ssh $USER@$HOST tar -C path/target/ -xvf -

这告诉将存档tar更改为(std)并包含所有()文件,然后通过管道将其解包到远程,在解包之前对目标输出目录进行更改。path/to/output/-.tar

相关内容