2

我刚刚从我的服务器下载了大约 600 个文件,需要从文件名中删除最后 11 个字符(不包括扩展名)。我使用 Ubuntu,我正在寻找一个命令来实现这一点。

一些例子如下:

aarondyne_kh2_13thstruggle_or_1250556383.mus应该改名为aarondyne_kh2_13thstruggle_or.mus

aarondyne_kh2_darknessofunknow_1250556659.mp3应该改名为aarondyne_kh2_darknessofunknow.mp3

执行此操作后似乎可能存在一些重复项,但如果命令无法完成并告诉我重复项是什么,我总是可以手动删除它们。

4

5 回答 5

4

尝试使用rename命令。它允许您根据正则表达式重命名文件:

以下行应该适合您:

rename 's/_\d+(\.[a-z0-9A-Z]+)$/$1/' *

将发生以下变化:

aarondyne_kh2_13thstruggle_or_1250556383.mus renamed as aarondyne_kh2_13thstruggle_or.mus
aarondyne_kh2_darknessofunknow_1250556659.mp3 renamed as aarondyne_kh2_darknessofunknow.mp3

您可以rename通过指定-n标志来检查将执行的操作,如下所示:

rename -n 's/_\d+(\.[a-z0-9A-Z]+)$/$1/' *

有关如何使用的更多信息,rename只需通过以下方式打开手册页:man rename

于 2013-02-15T16:36:08.820 回答
1

不是最漂亮的,但非常简单:

echo "$filename" | sed -e 's!\(.*\)...........\(\.[^.]*\)!\1\2!'

您仍然需要编写脚本的其余部分,但这很简单。

于 2013-02-15T16:35:45.357 回答
1
find . -type f -exec sh -c 'mv {} `echo -n {} | sed  -E -e "s/[^/]{10}(\\.[^\\.]+)?$/\\1/"`' ";"
于 2013-02-15T16:40:03.233 回答
0

一种方法:

你得到你的文件列表,每行一个(ls可能)然后:

ls....|awk  '{o=$0;sub(/_[^_.]*\./,".",$0);print "mv "o" "$0}'

这将打印mv a b命令

例如

kent$  echo "aarondyne_kh2_13thstruggle_or_1250556383.mus"|awk  '{o=$0;sub(/_[^_.]*\./,".",$0);print "mv "o" "$0}'
mv aarondyne_kh2_13thstruggle_or_1250556383.mus aarondyne_kh2_13thstruggle_or.mus

要执行,只需将其传送到|sh

我假设您的文件名中没有空格。

于 2013-02-15T16:39:11.630 回答
0

该脚本假定每个文件只有一个扩展名。例如,它将“foo.something.mus”重命名为“foo.mus”。要保留所有扩展,请从循环主体的第一行删除一个井号 (#)。它还假设每个文件名的基数至少有 12 个字符,因此删除 11 不会给您留下一个空名称。

for f in *; do
    ext=${f##*.}
    new_f=${base%???????????.$ext}
    if [ -f "$new_f" ]; then
        echo "Will not rename $f, $new_f already exists" >&2
    else
        mv "$f" "$new_f"
    fi
done
于 2013-02-15T16:41:07.680 回答