2013-02-15 92 views
2

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

一些例子如下:

aarondyne_kh2_13thstruggle_or_1250556383.mus应该被重新命名为aarondyne_kh2_13thstruggle_or.mus

aarondyne_kh2_darknessofunknow_1250556659.mp3应该被重新命名为aarondyne_kh2_darknessofunknow.mp3

看来,我这样做后,有些重复可能存在,但如果命令未能完成并告诉我重复项是什么,我总是可以手动删除它们。

回答

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

+4

注意:我的重命名版本(stock fedora 18!)没有标志''-n'',并且工作原理不同。特别的是,它不支持正则表达式,而只支持宏。 – 2013-02-15 16:37:48

+0

@JonasWielicki感谢您的注意。我在Ubuntu 12.10桌面版上测试了答案,所以至少应该解决最初的问题。 – TimWolla 2013-02-15 16:39:02

+1

非常感谢。这帮助了我! – 2013-02-15 16:49:32

1

不是最漂亮的,但很简单:

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

你仍然需要编写脚本的其余部分,但它是非常简单的。

+0

有趣。我知道例如'sed -e s/anton/berta'用'berta'替代'anton',用's'代替'substitute'。你的语法错过了正斜杠! '[^。]'是什么?是否排除所有字符?我知道'man sed' .. – Timo 2017-11-27 09:45:30

+0

ohh,'!'现在是分隔符,因为它对文件名更好,所以你搜索'...'并且用什么都替换('\ 1 \ 2')? – Timo 2017-11-27 10:00:43

+0

加上一个简单的设计。你怎么知道从最后开始没有扩展? – Timo 2017-12-11 10:13:48

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

我假设有你的文件名中没有空间。

+1

有比获得所有文件的名字更安全的方法,而不是解析'ls'的输出;请参阅http://mywiki.wooledge.org/ParsingLs – chepner 2013-02-15 16:42:57

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

我喜欢简短的语法,所以加上1.你能解释你做了什么吗?你替换了所有的字符,但不是。 ('[^ \。]')没有任何东西('\\ 1')? sed如何知道从最后开始但不包括扩展名? – Timo 2017-12-11 10:09:18

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 
相关问题