我正在尝试做一些简单的事情,例如使用 sed 重命名文件夹的所有文件。目的是在文件夹的每个文件前面添加一个模式。
在使用“mv”命令实际重命名文件之前,我使用“echo”命令来确保文件名正确。
我在 MAC OSX 上(使用 Iterm2)。我找到了不同的解决方案,但它根本不起作用。这是我所做的:
for f in *.mkv
do
test1=`echo $f | sed -E 's/^(.*)$/^S01E(.*)$/g'`
test2=$(echo $f | sed 's#^(.*)$#^S01E(.*)$#')
echo "$f"
echo "$test1"
echo "$test2"
done
$test1 output: ^S01E(.*)$
$test2 output : the filename itselft
Run Code Online (Sandbox Code Playgroud)
让我们分析您的sed命令:
第一个 sed 命令
sed -E 's/^(.*)$/^S01E(.*)$/g'
Run Code Online (Sandbox Code Playgroud)
替代正则表达式捕捉一切从开始^到结束$行,使用(.*)。通常sed会要求您对括号进行转义:\(.*\),但由于您使用-E的是正确的打印方式。接下来,它尝试为捕获的内容添加前缀S01E。这是哪里出错了:^ (.*) $在替换中不应重复正则表达式模式。相反,只需输入您的前缀,然后是\1which 代表第一个捕获组(括号)。第二次捕获将结束\2,依此类推。哦,g不需要修饰符,因为只有一个替换。所以:
test1=`echo $f | sed -E 's/^(.*)$/S01E\\1/'`
Run Code Online (Sandbox Code Playgroud)
文件的结果01-somemovie.mkv:
S01E01-somemovie.mkv
Run Code Online (Sandbox Code Playgroud)
第二个 sed 命令
sed 's#^(.*)$#^S01E(.*)$#'
Run Code Online (Sandbox Code Playgroud)
在替换部分有类似的问题,另外你应该转义括号,因为它不使用-E. 这样做:
sed 's#^\(.*\)$#S01E\1#'
Run Code Online (Sandbox Code Playgroud)
专家提示
由于您使用的是 Mac OSX,请使用Homebrew安装该实用程序rename。然后就rename --prepend S01E *.mkv完成了:
$ brew install rename
$ rename -n --prepend S01E *.mkv
'01-somemovie.mkv' would be renamed to 'S01E01-somemovie.mkv'
'02-somemovie.mkv' would be renamed to 'S01E02-somemovie.mkv'
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
859 次 |
| 最近记录: |