【问题标题】:Rename portion of a directory重命名目录的一部分
【发布时间】:2016-11-07 23:28:00
【问题描述】:

我正在处理一个清理过程,该过程需要 IP 地址八位字节(在大多数情况下是前两个或三个)并用掩码变量替换它们。

例如:

192.168.100.10 = xxx.yyy.zzz.10

对于包含此 txt 的文件,这很容易做到(感谢 sed),但我也需要对目录执行此操作。

我的问题是(不安装任何额外的 perl 包等)找到包含完整 ip 和地址的文件夹的最佳方法是什么,并且只有被屏蔽的部分被替换。

例如:

/logs/folder/192.168.100.10/data -> /logs/folder/xxx.yyy.zzz.10/data

源 IP 八位字节 = $IP & 掩码值 = $IMASK

【问题讨论】:

  • 你看过find 用1 行帮助脚本来执行子字符串替换mv

标签: bash shell directory rename


【解决方案1】:

如果你不认为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 的实现,用法完全不同。

查看一下,如果您有任何问题,请告诉我。

【讨论】:

  • 谢谢!我能够利用您的第一个示例并将这些概念集成到我已经创建的内容中。这很好用!!顺便说一句,律师和工程师!?很有趣的组合! :) 再次感谢!!
  • 是的,律师和工程师——双相教育障碍的完美设置。我实际上是在星期五在两个 ISP 之间仲裁一个案件,索赔中涉及的许多问题都围绕着对 Platypus ISP 计费软件和 MSSQL 后端的操纵,因此了解技术方面是一个明确的优势。很高兴你能在帖子中找到一些帮助。祝你的脚本好运。
猜你喜欢
  • 2013-12-05
  • 1970-01-01
  • 2022-01-09
  • 2019-02-05
  • 2015-12-17
  • 2010-11-18
  • 2020-01-29
  • 2010-11-26
  • 1970-01-01
相关资源
最近更新 更多