在Bash中移除文本文件的文件扩展名

3

我已经将许多文件名放在一个文本文件中,这些文件名是特定的.log文件:

ls *.log > finished_data.txt

现在我已经有了.log文件的列表,如何保留文件名但删除.log扩展名呢?我的思路是将它们全部重命名。

2
你有没有注意到这个页面右上角的“搜索问答”框? - Jdamian
2个回答

7

只需循环遍历 .log 文件并移动它们:

for file in *.log
do
    mv "$file" "${file%.log}"
done

这里使用shell参数扩展

$ d="a.log.log"
$ echo "${d%.log}"
a.log

谢谢,它完美地工作了。我如何才能反转这个操作?比如将“.log”添加到某些文件的末尾? - user3667111
1
@user3667111 只要说mv "$file" "${file}.log" - fedorqui
@gniourf_gniourf 哦,谢谢,我总是混淆 %%%。我知道 % 取最短匹配,这是最准确的。关于 for 循环的语法:有什么区别吗? - fedorqui
1
@gniourf_gniourf 啊,没错!我误解了你的评论,以为你是指使用 for file in ...; do 而不是 for file in ... + 换行 + do。你说得对,我会更新的。 - fedorqui

1
使用rename命令通过删除文件名末尾的.log来重命名所有.log文件:
rename 's/\.log$//' *.log
  • \.log$匹配文件名末尾的.log并将其替换为空格以省略该部分

如果您正在使用prename,则可以先进行干运行:

rename -n 's/\.log$//' *.log

如果对所要进行的更改满意:
rename 's/\.log$//' *.log

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接