我刚从服务器下载了大约600个文件,需要从文件名中删除最后11个字符(不包括扩展名)。我使用Ubuntu,我正在寻找实现此目的的命令。
一些例子如下:
aarondyne_kh2_13thstruggle_or_1250556383.mus
应重命名为aarondyne_kh2_13thstruggle_or.mus
aarondyne_kh2_darknessofunknow_1250556659.mp3
应重命名为aarondyne_kh2_darknessofunknow.mp3
在我执行此操作后似乎可能存在一些重复项,但如果命令无法完成并告诉我重复项将是什么,我可以随时手动删除它们。
答案 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