1

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

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

我意识到它正在移动与 .log 相关的当前$fname变量,但这让${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
4

2 回答 2

3

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

mv file.log file.LOG
于 2013-05-02T08:22:31.350 回答
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 脚本指南。

于 2013-05-02T08:25:15.550 回答