我想使用 scp 将.
目录中的所有文件(包括“隐藏”文件)复制output
到远程目录。欢迎使用其他方法,但 除外。不幸的是,托管服务提供商不允许安装它。target
rsync
我查找了几种解决方案但似乎比我预想的要难。
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
我正在使用找到的解决方案这里使用ssh
和tar
:
tar -C path/to/output/ -cf - . | ssh $USER@$HOST tar -C path/target/ -xvf -
这告诉将存档tar
更改为(std)并包含所有()文件,然后通过管道将其解包到远程,在解包之前对目标输出目录进行更改。path/to/output/
-
.
tar