在 OSX 中使用 Sed 重命名文件

Dav*_* D. 0 macos bash sed

我正在尝试做一些简单的事情,例如使用 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)

gre*_*eke 5

让我们分析您的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)