BASH将.log重命名为.LOG

时间:2013-05-02 08:16:04

标签: bash

我很难理解这一点。我已经研究了大括号扩展和mv命令,但由于某种原因它对我来说仍然没有意义。我正在阅读Unix和Linux系统管理手册,他们以此为例,但我不理解这一行:

mv $fname ${fname/.log/.LOG};

我意识到它正在移动当前$fname变量,这与.log有关,但${fname/.log/.LOG};令我感到困惑。我以为它基本上是mv源目的地...那么为什么有2 /?如果有人能用简单的英语向我解释这一点,我将非常感激!

#!/bin/bash

find . -type f -name '*.log' | grep -v .do-not-touch | while read fname;
do
mv $fname ${fname/.log/.LOG/};
done

2 个答案:

答案 0 :(得分:3)

mv行应解释为“将$fname移至${fname/.log/.LOG}”。 ${var/pattern/string}构造是参数扩展的一种形式,称为模式替换。它返回变量的值,第一次出现的模式被字符串替换。换句话说,在这种情况下,它会将.log替换为.LOG。因此,对于每个文件,该行类似于

mv file.log file.LOG

答案 1 :(得分:1)

正如您所说,$ fname包含以“.log”结尾的原始文件名。你看到的bash表达式是:获取变量$ fname的内容,找到“.log”并将其替换为“.LOG”。生成的行将以“.log”结尾的文件移动到具有相同名称的文件,但将“.log”替换为“.LOG”。

您可能需要查看http://tldp.org/LDP/abs/html/http://www.tldp.org/LDP/abs/abs-guide.pdf以获取高级bash脚本编制指南。