重命名目录的一部分

时间:2016-07-06 01:12:47

标签: bash shell directory rename

我正在进行一个消毒过程,该过程采用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

1 个答案:

答案 0 :(得分:0)

如果您不认为find命令是额外软件包,那么您可以完全按照findwhile循环执行操作,或find以及简短的一行帮助程序脚本只要 IP在任何给定的路径层次结构中仅出现一次

利用findwhile循环以及子字符串替换,您可以执行以下操作:

#!/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的实现,用法完全不同。

仔细看看,如果您有任何问题,请告诉我。