Unix:删除文件名,仅获取扩展名,然后使用sed重命名扩展名

Unix:删除文件名,仅获取扩展名,然后使用sed重命名扩展名,unix,sed,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 在您的解决方案

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

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

在您的解决方案中仅添加其他替代

sed 's/^.*\.//; s/fil/asc/'  
使用该条件重命名目录中的所有文件

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

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

您可以尝试此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
这可能适用于您(GNU-sed):

使用求值的替换命令。替换将删除直到最后一个
为止的所有内容,并将此后的所有内容保留为第一个反向引用。该反向引用中第一个
\uu
后面的所有内容也将保留为第二个反向引用。替换命令的RHS使用LHS中的零件形成
mv
命令

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

sed 's/.*\.\([^_]*\(.*\)\)/mv \1 asc\2/' file | shell
使用以下方法可能更安全:

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

值得解释一下这个命令的作用和工作原理。无响应的Op以字符串而不是文件名为例。对于文件名操作,正确的命令是重命名。请注意,像这样解析
ls
的输出是危险的(如果文件名包含空格或其他特殊字符,通常不会给出所需的结果)。在上下文中,
foreach C(118 edorf.sum.fil*)
可能会做同样的工作(我猜,实际上不是
zsh
用户)。在一个类似于POSIX的shell中,在118 edorf.sum.fil*中对C使用
,这个函数肯定会工作。是的,这是真的。我已经试过很多次了。:-)然后我会求助于perl、python、ruby等,它们可以更好地处理带有空格的文件名。
sed -r 's/.*\.(fil(.*))/mv \1 asc\2/e' file