unix命令中大括号的用法是什么?

时间:2013-05-15 22:34:42

标签: unix terminal

我一直在寻找如何在unix文件名中使用{}功能。例如,我有一个目录,其子目录名为ID#。每个子目录都有一个录制的音频文件,名为特定的测试问题ID#。以下命令:

for file in */1-01*; do echo "$file"; done

将列出当前目录的每个子目录中的音频文件的名称。这样做给了我一个清单:

809043250/1-01-20131.wav
813777079/1-01-20131.wav
817786199/1-01-20131.wav
827832538/1-01-20131.wav
834820477/1-01-20131.wav

我想将上述每个.wav文件重命名为不同的ID#,所以它应该像这样结束:

809043250/5001.wav
813777079/5001.wav
817786199/5001.wav
827832538/5001.wav
834820477/5001.wav

那么,如果我想使用${file/firstOccurance/replaceWith}命令来保存此人的ID#(809043250,813777079等)和第一个mv,那么如何使用/表示法关闭1-01-20131.wav并点击5001.wav

我不知道如何在谷歌上搜索这个。它被称为正则表达式(我不这么认为......)?括号表示法?文件名模式?有谁知道这些的好解释?

谢谢!

1 个答案:

答案 0 :(得分:1)

bash中,符号的一个变体称为Brace Expansion。这会生成文件名。

符号的其他变体称为Shell Parameter Expansion。在此,bash提供了正则表达式替换符号${var/match/replace}

出于您的目的,您需要扩展参数:

$ x="809043250/1-01-20131.wav
> 813777079/1-01-20131.wav
> 817786199/1-01-20131.wav
> 827832538/1-01-20131.wav
> 834820477/1-01-20131.wav"
$ for file in $x; do echo $file ${file/1-01-20131/5001}; done
809043250/1-01-20131.wav 809043250/5001.wav
813777079/1-01-20131.wav 813777079/5001.wav
817786199/1-01-20131.wav 817786199/5001.wav
827832538/1-01-20131.wav 827832538/5001.wav
834820477/1-01-20131.wav 834820477/5001.wav
$