我正在进行一个消毒过程,该过程采用IP地址八位字节(大多数情况下是前两个或三个)&用掩码变量替换它们。
例如:
192.168.100.10 = xxx.yyy.zzz.10
这对于包含此txt的文件非常容易(谢谢你),但我也需要为目录执行此操作。
我的问题是(没有安装任何额外的perl软件包等)找到包含完整ip&文件夹的文件夹的最佳方法是什么?地址&只有被遮挡的部分才会被替换。
例如:
/logs/folder/192.168.100.10/data -> /logs/folder/xxx.yyy.zzz.10/data
源IP八位字节= $ IP&掩码值= $ IMASK
答案 0 :(得分:0)
如果您不认为find
命令是额外软件包,那么您可以完全按照find
和while
循环执行操作,或find
以及简短的一行帮助程序脚本只要 IP
在任何给定的路径层次结构中仅出现一次。
利用find
和while
循环以及子字符串替换,您可以执行以下操作:
#!/bin/bash
srchdir="$1"
export ip=192.168.100
export mask=xxx.yyy.zzz
while read -r line; do
mv "$line" "${line/$ip/$mask}"
done < <(find "$srchdir" -type d -name "*$ip*")
示例强>
使用包含以下内容的临时目录td
:
$ tree td
td
├── 192.168.100.10
│ └── data
└── 192.168.100.20
└── data
$ bash maskip.sh td
$ tree td
td
├── xxx.yyy.zzz.10
│ └── data
└── xxx.yyy.zzz.20
└── data
使用find
和-exec
以及简短的单行助手脚本,find
会抱怨您已使用脚本重新安排了结果树,但会执行请求的操作。要摆脱find
的警告,您只需将输出重定向到/dev/null
即可。使用相同的td
示例(并使用相同的结果),您可以执行以下操作:
$ ip=192.168.100; mask=xxx.yyy.zzz; \
find td -type d -name "*${ip}*" \
-exec ./helper.sh '{}' "$ip" "$mask" \; >/dev/null 2>&1
帮助程序脚本只不过是:
#!/bin/bash
mv "$1" "${1/$2/$3}"
注意,rename
命令也可用,但取决于你是否具有util-linux
的实现,用法完全不同。
仔细看看,如果您有任何问题,请告诉我。