我一直在寻找如何在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
?
我不知道如何在谷歌上搜索这个。它被称为正则表达式(我不这么认为......)?括号表示法?文件名模式?有谁知道这些的好解释?
谢谢!
答案 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
$