需要救助RH虚拟服务器的帮助 – shell命令修复错误?

我有一个虚拟机运行我们的主要应用程序之一。 在做一个相当重的改变之前,我做了两行备份。 首先,我拍了一个虚拟机快照。 其次,我通过整个系统运行recursionsed命令来replace文件中的文本,并创build备份。 直到我跑完这个之后,我才意识到这个变化是多么的广泛。 这就是我跑的:

 find / -type f -print0|xargs -0 sed -i.matthew05012013 's/oldtext/newtext/g' 

我试图恢复快照,但最终删除它,而是承诺了所有的更改(因为ESX命名法是快乐混淆快照)。 所以,我的最后一道防线是recursion地通过系统,并且用.matthew05012013扩展名重命名任何添加到相同的文件名,没有扩展名,覆盖任何有。

有没有人有任何想法如何最好地执行此? 手工不起作用,有几千个文件已经被系统修改了。

虽然不完美优雅下面应该做的伎俩:

 for modfile in `find <dir> -name "*.matthew05012013"`; do realfile=`echo $modfile | sed 's/.matthew05012013//'` cp $modfile $realfile done 

我做了一个testing目录:

 $ find /tmp/deleteme/ /tmp/deleteme/ /tmp/deleteme/1 /tmp/deleteme/1/filea /tmp/deleteme/1/fileb /tmp/deleteme/1/filec /tmp/deleteme/1/filed /tmp/deleteme/1/fileb.matthew05012013 /tmp/deleteme/1/filed.matthew05012013 /tmp/deleteme/2 /tmp/deleteme/2/filea /tmp/deleteme/2/fileb /tmp/deleteme/2/filec /tmp/deleteme/2/filed /tmp/deleteme/2/fileb.matthew05012013 /tmp/deleteme/2/filed.matthew05012013 /tmp/deleteme/3 /tmp/deleteme/3/filea /tmp/deleteme/3/fileb /tmp/deleteme/3/filec /tmp/deleteme/3/filed /tmp/deleteme/3/fileb.matthew05012013 /tmp/deleteme/3/filed.matthew05012013 /tmp/deleteme/4 /tmp/deleteme/4/filea /tmp/deleteme/4/fileb /tmp/deleteme/4/filec /tmp/deleteme/4/filed /tmp/deleteme/4/fileb.matthew05012013 /tmp/deleteme/4/filed.matthew05012013 /tmp/deleteme/5 /tmp/deleteme/5/filea /tmp/deleteme/5/fileb /tmp/deleteme/5/filec /tmp/deleteme/5/filed /tmp/deleteme/5/fileb.matthew05012013 /tmp/deleteme/5/filed.matthew05012013 /tmp/deleteme/6 /tmp/deleteme/6/filea /tmp/deleteme/6/fileb /tmp/deleteme/6/filec /tmp/deleteme/6/filed /tmp/deleteme/6/fileb.matthew05012013 /tmp/deleteme/6/filed.matthew05012013 $ for modfile in `find /tmp/deleteme -name "*.matthew05012013"`; do realfile=`echo $modfile | sed 's/.matthew05012013//'` echo "cp $modfile $realfile" done cp /tmp/deleteme/1/fileb.matthew05012013 /tmp/deleteme/1/fileb cp /tmp/deleteme/1/filed.matthew05012013 /tmp/deleteme/1/filed cp /tmp/deleteme/2/fileb.matthew05012013 /tmp/deleteme/2/fileb cp /tmp/deleteme/2/filed.matthew05012013 /tmp/deleteme/2/filed cp /tmp/deleteme/3/fileb.matthew05012013 /tmp/deleteme/3/fileb cp /tmp/deleteme/3/filed.matthew05012013 /tmp/deleteme/3/filed cp /tmp/deleteme/4/fileb.matthew05012013 /tmp/deleteme/4/fileb cp /tmp/deleteme/4/filed.matthew05012013 /tmp/deleteme/4/filed cp /tmp/deleteme/5/fileb.matthew05012013 /tmp/deleteme/5/fileb cp /tmp/deleteme/5/filed.matthew05012013 /tmp/deleteme/5/filed cp /tmp/deleteme/6/fileb.matthew05012013 /tmp/deleteme/6/fileb cp /tmp/deleteme/6/filed.matthew05012013 /tmp/deleteme/6/filed 

显然这和你之前提到过的那种笨手笨脚的方法是一致的,如果我在生产环境中这样做的话,我可能会回应cp命令(如我的testing中所示)并将它们发送到一个文件进行审阅。 然后,只要我确认一切看起来正确,就执行它们。 只要确定你所寻找的string(例如.matthew05012013)是足够独特的,这样它就不会匹配别的东西。 用'mv'replace'cp',或者用其他命令漂浮你的船。

我还build议在做这个改动之前再做一次快照,不过为了防万一出现问题,你不必去尝试清理一些乱七八糟的东西。

在此更改期间,请注意保留权限。 在执行此操作之前,请检查“cp”手册页以添加用于保留权限的参数或实现特定的umask。 如果有数千个文件的权限不允许应用程序正常运行,则可以快速进入热水中。

 find / -type f -name '*.matthew05012013' -print0 | \ xargs -0 rename .matthew05012013 "" 

如果在名称中出现两次“.matthew05012013”​​的文件,则会失败。 这可能不是这种情况,可以通过使用另一种工具如mmv或简单的shell脚本来防止。