在OSX中使用Sed重命名文件

时间:2014-02-01 10:13:34

标签: 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

4 个答案:

答案 0 :(得分:4)

让我们分析您的sed命令:

第一个sed命令

sed -E 's/^(.*)$/^S01E(.*)$/g'

替换正则表达式使用^捕获从行的$到结束(.*)的所有内容。通常sed会要求您转义括号:\(.*\),但由于您使用的是-E,因此打印正确。接下来,它尝试使用S01E为捕获的内容添加前缀。这出错:在替换中不应重复正则表达式^ (.*) $。相反,只需输入您的前缀,然后输入代表第一个捕获组(括号)的\1。第二次捕获将以\2结束,依此类推。哦,不需要g修饰符,因为只有一个替换。所以:

test1=`echo $f | sed -E 's/^(.*)$/S01E\\1/'`

文件01-somemovie.mkv的结果:

S01E01-somemovie.mkv

第二个sed命令

sed 's#^(.*)$#^S01E(.*)$#' 

在替换部分有类似的问题,另外你应该转义括号,因为它不使用-E。这样做:

sed 's#^\(.*\)$#S01E\1#'

专业提示

由于您使用的是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'

答案 1 :(得分:1)

我相信这些行应该是:

test1=`echo "$f" | sed 's/^\(.*\)$/^S01E\1$/'`

test2=$(echo "$f" | sed 's#^\(.*\)$#^S01E\1$#')

答案 2 :(得分:0)

你可以使用sed(但我认为@grebneke提供了两个不错的选择)或者你可以安装mmv

% brew install mmv
% mmv '*.mkv' 'S01E#1.mp3'

答案 3 :(得分:0)

你绝对不需要sed,它只是:

for f in *.mkv
do
    test1="S01E$f"

    echo "$f"
    echo "$test1"
done

此外,请记住始终引用您的shell变量,除非您有非常具体的理由不知道后果/含义是什么。例如总是echo "$f",而不是echo $f,就像你在问题的某些地方所做的那样。