如何更改/删除一组文件的文件扩展名

如何更改/删除一组文件的文件扩展名

我有一个一堆 .txt 文件在目录中,我希望能够找到这些文件并删除扩展名来自文件名。

我可以查找文件使用:

$ find . -maxdepth 1 -type f -name "*.txt"
./0test.txt
./1test.txt
./2test.txt
./3test.txt
./4test.txt
./5test.txt
./6test.txt
./7test.txt
./8test.txt
./9test.txt

然后我尝试使用sed 命令删除“.txt”扩展名, 喜欢:

find . -maxdepth 1 -type f -name "*.txt" | sed "s/\.txt$//"

我刚刚得到列出的文件名不包含扩展名,以及实际文件名保持不变

所以如何你真的更改文件名本身

答案1

在 bash 中怎么样

for v in *.txt ; do mv "$v"  "$(basename "$v" .txt)"; done

答案2

$在正则表达式中匹配字符串的结尾,不能匹配字符那,仅此之前。

.需要进行转义以阻止其具有特殊含义(任何字符)。

所以:

find . -maxdepth 1 -type f -name "*.txt" | sed "s/\.txt$//"

如果你想改名然后,您可以使用基于 perl 的rename命令进行相同的正则表达式替换

rename "s/\.txt$//" *.txt

find(当所有文件都在单个目录级别中时,你不需要这样做),或者使用以下简单的 shell 循环mv

for f in *.txt; do mv -n -- "$f" "${f%.txt}"; done

答案3

我知道这是一个老问题,也许有人会从中受益。昨晚我需要用 sed 做同样的事情,我请求上帝告诉我,我一直在尝试这个: echo filename.txt | sed 's/\.*$// 但它不起作用,它按原样显示文件名(包括扩展名)。这是上帝揭示的echo filename.txt | sed 's/\...*$//' filename

这不仅会删除 3 个字母的扩展名,还会删除多个扩展名,即 tar.bz2、tar.xz 甚至 tar.gz。

echo filename.txt | sed 's/\...*$//'     filename
echo filename.epub | sed 's/\...*$//'     filename
echo filename.tar.xz | sed 's/\...*$//'     filename
echo filename.tar.bz2 | sed 's/\...*$//'     filename
echo filename.txt.gz| sed 's/\...*$//'     filename

这也达到了预期的结果:

echo filename.txt | sed 's/\..*//'     filename

相关内容