*.html
文件。我想把它们全部重命名为*.txt
。我该怎么做呢? 我使用Bash shell。
*.html
文件。我想把它们全部重命名为*.txt
。rename -n ’s/\.htm$/\.html/’ *.htm
rename -v ’s/\.htm$/\.html/’ *.htm
-v是可选的,但最好包含它,因为它是您将通过重命名命令进行更改的唯一记录,如下面示例输出所示:
$ rename -v 's/\.htm$/\.html/' *.htm
3.htm renamed as 3.html
4.htm renamed as 4.html
5.htm renamed as 5.html
中间棘手的部分是一个带有正则表达式的Perl替换,如下所示:
rename -v ’s/\.htm$/\.html/’ *.htm
一行代码,无需循环:
ls -1 | xargs -L 1 -I {} bash -c 'mv $1 "${1%.*}.txt"' _ {}
例子:
$ ls
60acbc4d-3a75-4090-85ad-b7d027df8145.json ac8453e2-0d82-4d43-b80e-205edb754700.json
$ ls -1 | xargs -L 1 -I {} bash -c 'mv $1 "${1%.*}.txt"' _ {}
$ ls
60acbc4d-3a75-4090-85ad-b7d027df8145.txt ac8453e2-0d82-4d43-b80e-205edb754700.txt
mmv命令似乎可以在处理大量文件时(每秒数万个)非常高效地完成此任务。例如,要将所有.xml
文件重命名为.html
文件,请使用以下命令:
mmv ";*.xml" "#1#2.html"
;
将匹配路径,*
将匹配文件名,并且在替换名称中被称为#1
和#2
。
基于exec
或管道的答案要么速度太慢,要么在大量文件上失败。
for fname in *.{mp4,avi}
do
mv -v "$fname" "${fname%.???}.mkv"
done
在爬取别人的网站之后,我得到了一堆文件,这些文件没有 .html 扩展名,而且分布在许多子目录下。
为了一次性修改它们的名称(除了那些已经有 .html 扩展名的文件外,大部分文件都没有扩展名),以下方法对我很有用:
cd wwwroot
find . -xtype f \! -iname *.html -exec mv -iv "{}" "{}.html" \; # batch rename files to append .html suffix IF MISSING
find . -xtype f -iname *.txt -exec filename="{}" mv -iv ${filename%.*}.{txt,html} \;
拆分(锤子时间!):
-iname *.txt
- 表示只考虑文件名已经以 .txt 结尾的文件
mv -iv "{}.{txt,html}"
- 当 find 将 {} 作为文件名传递时,${filename%.*} 提取其没有扩展名的基本名称以形成 mv 的参数。 bash 使用 {txt,html} 重写它作为两个参数,因此最终命令运行为:mv -iv "filename.txt" "filename.html"
需要修复:处理文件名中的空格。
试试这个
rename .html .txt *.html
使用方法:
rename [find] [replace_with] [criteria]
使用 shell 脚本为当前目录和子目录下的所有文件重命名文件扩展名(不需要其他软件包):
Create a shell script rename.sh
under current directory with the following code:
#!/bin/bash
for file in $(find . -name "*$1"); do
mv "$file" "${file%$1}$2"
done
Run it by ./rename.sh .old .new
.
Eg. ./rename.sh .html .txt
mv
中添加&
,但是那样您可能会产生100个或1000个衍生进程。使用xargs
,您可以确保-P 20
将允许最多20个分叉进程。 - Christian Bongiornofor file in $(find ...)
对包含空格或shell元字符的文件名本质上是有问题的。请参阅https://mywiki.wooledge.org/BashFAQ/020 - undefined有点晚了。您可以使用xargs来完成:
ls *.html | xargs -I {} sh -c 'mv $1 `basename $1 .html`.txt' - {}
如果您的所有文件都在某个文件夹中
ls folder/*.html | xargs -I {} sh -c 'mv $1 folder/`basename $1 .html`.txt' - {}
ls
命令解析文件列表,这种做法很荒谬:它无用地在 ls
命令中使用通配符,而不是直接使用通配符。这样做会导致包含空格、引号和通配符字符的文件名出错。 - gniourf_gniourf最简单的方法是使用rename.ul
,它在大多数Linux发行版中都存在。
rename.ul -o -v [旧文件扩展名] [新文件扩展名] [要应用于的文件搜索表达式]
rename.ul -o -v .oldext .newext *.oldext
选项:
-o:不覆盖已存在的.newext文件
-v:详细模式
-n:模拟运行
与之前所建议的类似,这是我完成它的方式:
find . -name '*OldText*' -exec sh -c 'mv "$0" "${0/OldText/NewText}"' {} \;
我首先使用了验证工具
find . -name '*OldText*' -exec sh -c 'echo mv "$0" "${0/OldText/NewText}"' {} \;
ls
或xargs
;只需使用for f in ./*; do mv "$f" "${f%.*}.swift; done
。 - undefined