2016-07-06 108 views
0

我正在進行一個消毒過程,它使用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

+0

您是否看過'find'與1行輔助腳本來執行*子字符串替換*和'mv'? –

回答

0

如果不考慮find命令的額外包,你可以做正是你想要做什麼findwhile循環,或find和短一行幫手腳本只要IP只出現rs 一旦在任何給定的路徑層次結構。

利用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執行,用法都是完全不同的。

看看兩邊,讓我知道你是否有任何問題。