在Linux中删除10个文件名字符

时间:2013-02-15 16:29:47

标签: linux shell ubuntu file-rename batch-rename

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

一些例子如下:

aarondyne_kh2_13thstruggle_or_1250556383.mus应重命名为aarondyne_kh2_13thstruggle_or.mus

aarondyne_kh2_darknessofunknow_1250556659.mp3应重命名为aarondyne_kh2_darknessofunknow.mp3

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

5 个答案:

答案 0 :(得分:3)

尝试使用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

答案 1 :(得分:1)

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

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

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

答案 2 :(得分:1)

find . -type f -exec sh -c 'mv {} `echo -n {} | sed  -E -e "s/[^/]{10}(\\.[^\\.]+)?$/\\1/"`' ";"

答案 3 :(得分:0)

一种方法:

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

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

这将打印mv a b命令

e.g。

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

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

答案 4 :(得分: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