我正在尝试做一些简单的事情,比如使用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
答案 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
,就像你在问题的某些地方所做的那样。