我有一个一堆 .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