写一个shell脚本,使用scp命令将指定路径下所有文件夹内的以log结尾的文件传输到本地服务器,并且其文件夹名称不发生改变
时间: 2024-03-16 20:41:59 浏览: 85
好的,下面是一个可能的实现,具体使用时需要修改相应的参数:
```bash
#!/bin/bash
# 远程服务器的IP地址
remote_ip=192.168.1.100
# 远程服务器上待传输文件所在的路径,需要修改为实际路径
remote_dir=/path/to/logs
# 本地服务器上接收文件的路径,需要修改为实际路径
local_dir=/path/to/local/dir
# 获取远程服务器上所有以log结尾的文件,并且保留其所在文件夹名
files=$(ssh user@$remote_ip "find $remote_dir -type f -name '*.log' -printf '%h/%f\n'")
# 依次传输每个文件到本地服务器
for file in $files; do
# 提取文件名和目录名
filename=${file##*/}
dirname=${file%/*}
# 创建本地目录(如果不存在)
mkdir -p "$local_dir/$dirname"
# 使用scp命令传输文件
scp "user@$remote_ip:$file" "$local_dir/$dirname/$filename"
done
```
解释一下脚本的实现过程:
1. 首先,我们需要指定远程服务器的IP地址、待传输文件所在的路径以及本地服务器上接收文件的路径。这些参数需要根据具体情况进行修改,可以在脚本开头进行定义。
2. 然后,我们使用ssh命令在远程服务器上查找所有以log结尾的文件,并且保留其所在文件夹名。具体实现是通过find命令加上printf选项来实现的。最终得到的结果是一个文件列表,每个文件都包含其所在的目录名和文件名,用空格分隔。
3. 接下来,我们使用for循环依次传输每个文件到本地服务器。在循环中,我们首先从文件名中提取出文件名和目录名。然后,我们创建本地目录(如果不存在),使用scp命令传输文件。在scp命令中,我们将远程文件的路径和本地文件的路径都组合起来,形成完整的文件路径。在文件路径中,我们使用双引号将路径括起来,以避免路径中含有空格等特殊字符的问题。
阅读全文