Unix:删除文件名,只获取扩展名并使用sed重命名扩展名

时间:2016-02-09 06:22:27

标签: unix sed

我有很多文件名都有这种格式:

118-edorf.sum.fil
118-edorf.sum.fil_1
118-edorf.sum.fil_11

我想删除118-edorf.sum。从文件名中获取扩展名,fil,fil_1和fil_11并将其重命名为asc,asc_1和asc_11。

到目前为止,我只能删除118-edorf.sum。使用

sed 's/.*\.//'

结果将是

fil
fil_1
fil_11

那么,如何将其重命名为

asc
asc_1
asc_11

3 个答案:

答案 0 :(得分:0)

在您的解决方案中只添加额外的替换

sed 's/^.*\.//; s/fil/asc/'  

使用该条件重命名目录中的所有文件

rename 's/^.*\.//; s/fil/asc/' *  

注意:此重命名命令未经测试

答案 1 :(得分:0)

你可以尝试这个zsh foreach循环。对于许多文件,Foreach可能有点慢。您还可以删除echo语句,以减少噪声较大的输出。

foreach C (`ls 118-edorf.sum.fil*`)
    f2=`echo $C|cut -d "." -f 3|cut -s -d "_" -f 2`
    if [ "${f2}" -eq "" ]; then
        echo "no underscore"
        mv $C asc
    elif
    echo "_${f2}"
    mv $C "asc_${f2}"
end

答案 2 :(得分:0)

这可能适合你(GNU sed):

sed -r 's/.*\.([^_]*(.*))/mv \1 asc\2/e' file

使用已评估的替换命令。替换删除了最后一个.的所有内容,并将此后的所有内容保留为第一个反向引用。在该反向引用中第一个_之后的所有内容也将保留为第二个反向引用。替换命令的RHS使用LHS中的部分形成mv命令。

如果您的sed没有e命令/标志,请使用:

sed 's/.*\.\([^_]*\(.*\)\)/mv \1 asc\2/' file | shell

使用起来可能更安全:

sed -r 's/.*\.(fil(.*))/mv \1 asc\2/e' file