0

我一直在寻找如何在 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}那么,如果我想使用mv命令来保留此人的 ID#(809043250、813777079 等)和第一个/但剥离1-01-20131.wav并粘贴,我该如何使用该符号5001.wav

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

谢谢!

4

1 回答 1

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
$
于 2013-05-15T22:40:40.110 回答