如何从服务器scp父目录下含子目录的所有.txt文件至本地并保留结构?
如何用SCP传输指定类型文件并保留目录结构
嘿,这个需求我太熟了——要从服务器的/master目录下把所有.txt文件(包括嵌套子目录里的)传到本地,还得原封不动保留目录结构对吧?给你两个实用方案,按需选就行:
方案1:SCP + Tar 管道传输(无需临时文件)
如果你的服务器上没装rsync,或者更倾向于只用scp相关的工具,这个方法最稳妥。核心思路是在服务器上把所有目标.txt文件打包(直接输出到管道),然后本地接收并解压,完美保留结构:
执行命令(本地终端运行)
# 先确保本地目标目录存在 mkdir -p /local-dir # 直接通过SSH+Tar管道传输,无需在服务器存临时包 ssh your_username@your_server_ip 'cd /master && find . -name "*.txt" -print0 | tar -czf - --null -T -' | tar -xzf - -C /local-dir
命令解释:
find . -name "*.txt" -print0:在/master下递归查找所有.txt文件,用-print0避免文件名含空格/特殊字符时出错tar -czf - --null -T -:把find找到的文件打包成gzip压缩包,-表示输出到标准输出,--null配合-print0处理特殊文件名,-T -表示从标准输入读取要打包的文件列表- 管道
|把服务器的打包输出直接传到本地,tar -xzf - -C /local-dir在本地解压到指定目录,自动重建目录结构
方案2:用Rsync(更简洁,支持断点续传)
如果服务器和本地都装了rsync(大部分Linux/Unix系统默认都有),这个方法更简单直观,而且自带断点续传,大文件或不稳定网络下更靠谱:
执行命令(本地终端运行)
mkdir -p /local-dir rsync -avz --include="*/" --include="*.txt" --exclude="*" your_username@your_server_ip:/master/ /local-dir/
命令解释:
-avz:a(归档模式,保留权限、时间戳等)+v(显示详细日志)+z(压缩传输,节省带宽)--include="*/":先包含所有子目录,这样rsync才能递归进去查找.txt文件--include="*.txt":包含所有.txt文件--exclude="*":排除其他所有文件/目录,确保只传需要的.txt和必要的目录结构
注意事项
- 替换
your_username@your_server_ip为你实际的服务器用户名和IP/域名 - 如果目标路径包含空格,记得用双引号把路径括起来,比如
"/local-dir/my folder" - 如果你需要sudo权限才能访问服务器上的
/master目录,可以在ssh命令里加sudo,比如:ssh your_username@your_server_ip 'sudo cd /master && ...'(可能需要输入sudo密码)
内容的提问来源于stack exchange,提问作者Yuchen Peng
相关产品推荐
相关产品推荐

