在一个目录中,我有一堆 *.html 文件 .
*.html
我想将它们全部重命名为 *.txt
*.txt
我使用bash shell .
这个问题明确提到了Bash,但是如果你碰巧有ZSH可用,那很简单:
zmv '(*).*' '$1.txt'
如果你得到 zsh: command not found: zmv 然后只需运行:
zsh: command not found: zmv
autoload -U zmv
然后再试一次 .
感谢original article关于zmv的提示 .
这是我发现适用于OSX和Linux的最简单的解决方案,它也适用于git!
find . -name "*.js" -exec bash -c 'mv "$1" "${1%.js}".tsx' - '{}' \;
和git:
find . -name "*.js" -exec bash -c 'git mv "$1" "${1%.js}".tsx' - '{}' \;
试试这个
rename .html .txt *.html
用法:
rename [find] [replace_with] [criteria]
派对有点晚了 . 你可以用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' - {}
要获得更好的解决方案(仅使用bash功能,而不是外部调用),请参阅one of the other answers .
以下内容可以并且不需要系统具有 rename 程序(尽管您最常在系统上使用此程序):
rename
for file in *.html; do mv "$file" "$(basename "$file" .html).txt" done
编辑:正如评论中所指出的,如果没有适当的引用(现在在上面添加),这对于包含空格的文件名不起作用 . 当你纯粹在自己的文件上工作时,你知道文件名中没有空格,这将有效,但每当你写一些可能在以后重复使用的东西时,不要跳过正确的引用 .
如果使用bash,则不需要外部命令,如sed,basename,rename,expr等 .
for file in *.html do mv "$file" "${file%.html}.txt" done
rename 's/\.html$/\.txt/' *.html
完全符合你的要求 .
你想使用rename:
rename -S .html .txt *.html
这完全符合您的要求 - 对于匹配 *.html 的所有文件,它会将扩展名从 .html 更改为 .txt .
.html
.txt
注意:Greg Hewgill正确地指出这不是一个bash内置;并且是一个单独的Linux命令 . 如果你只需要Linux上的东西,这应该可以正常工作;如果您需要更多跨平台的东西,那么请看一下其他答案 .
这在OSX上起作用,从.txt到.txt_bak
find . -name '*.txt' -exec sh -c 'mv "$0" "${0%.txt}.txt_bak"' {} \;
在Mac上......
如果您还没有安装rename: brew install rename
brew install rename
对于Ubuntu用户:
以下是重命名命令的示例:
rename -n ’s/\.htm$/\.html/’ *.htm
-n表示它是一个测试运行,实际上不会更改任何文件 . 它将显示一个文件列表,如果删除了-n,将重命名这些文件 . 在上面的例子中,它会将当前目录中的所有文件从.htm的文件扩展名转换为.html .
如果上面测试运行的输出看起来没问题,那么你可以运行最终版本:
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替换,突出显示如下:
在其他人的网站抓取之后,我最终在数据库中找到了数千个缺少.html扩展名的文件 .
要一次性重命名它们,除了已经有.html扩展名的文件(大多数都没有),这对我有用:
cd wwwroot find . -xtype f \! -iname *.html -exec mv -iv "{}" "{}.html" \; # batch rename files to append .html suffix IF MISSING
在OP的情况下,我可能稍微修改一下,只重命名* .txt文件,如下所示:
find . -xtype f -iname *.txt -exec filename="{}" mv -iv ${filename%.*}.{txt,html} \;
分解(hammertime!):
-iname * .txt
mv -iv "{}.{txt,html}" - 当 find 传递{}作为文件名时,$ {filename% . *}提取其基本名称而没有任何扩展名,以形成 mv 的参数 . bash 使用{txt,html}将其重写为两个参数,因此最终命令运行为: mv -iv "filename.txt" "filename.html"
mv -iv "filename.txt" "filename.html"
但需要修复:处理文件名中的空格
command mmv似乎在大量文件上非常有效地完成了这项任务(一秒钟内成千上万) . 例如,要将所有 .xml 文件重命名为 .html 文件,请使用以下命令:
.xml
mmv ";*.xml" "#1#2.html"
; 将匹配路径, * 将匹配文件名,这些在替换名称中称为 #1 和 #2 .
;
*
#1
#2
基于 exec 或管道的答案要么太慢,要么在大量文件上失败 .
exec
如果您更喜欢PERL,那么有一个简短的PERL脚本(由PERL的创建者Larry Wall编写),它将完全符合您的要求:tips.webdesign10.com/files/rename.pl.txt . 对于您的示例,以下应该可以解决问题
rename.pl 's/html/txt/' *.html
=)
(感谢@loretoparisi获取更新后的网址)
不幸的是,做便携并不是一件容易的事 . 你可能需要一些expr魔法 .
for file in *.html; do echo mv -- "$file" "$(expr "$file" : '\(.*\)\.html').txt"; done
一旦你开心它就能做你想做的事情,就去除回声 .
Edit: basename 对于这种特殊情况可能更具可读性,尽管 expr 一般来说更灵活 .
basename
expr
这是我用来将 .edge 文件重命名为 .blade.php 的内容
.edge
.blade.php
for file in *.edge; do mv "$file" "$(basename "$file" .edge).blade.php"; done
像魅力一样工作 .
这是一次修改多个扩展的好方法:
for fname in *.{mp4,avi} do mv -v "$fname" "${fname%.???}.mkv" done
注意:小心扩展大小要一样(???)
18 回答
这个问题明确提到了Bash,但是如果你碰巧有ZSH可用,那很简单:
如果你得到
zsh: command not found: zmv
然后只需运行:然后再试一次 .
感谢original article关于zmv的提示 .
这是我发现适用于OSX和Linux的最简单的解决方案,它也适用于git!
find . -name "*.js" -exec bash -c 'mv "$1" "${1%.js}".tsx' - '{}' \;
和git:
find . -name "*.js" -exec bash -c 'git mv "$1" "${1%.js}".tsx' - '{}' \;
试试这个
用法:
派对有点晚了 . 你可以用xargs做到这一点:
或者,如果您的所有文件都在某个文件夹中
要获得更好的解决方案(仅使用bash功能,而不是外部调用),请参阅one of the other answers .
以下内容可以并且不需要系统具有
rename
程序(尽管您最常在系统上使用此程序):编辑:正如评论中所指出的,如果没有适当的引用(现在在上面添加),这对于包含空格的文件名不起作用 . 当你纯粹在自己的文件上工作时,你知道文件名中没有空格,这将有效,但每当你写一些可能在以后重复使用的东西时,不要跳过正确的引用 .
如果使用bash,则不需要外部命令,如sed,basename,rename,expr等 .
完全符合你的要求 .
你想使用rename:
这完全符合您的要求 - 对于匹配
*.html
的所有文件,它会将扩展名从.html
更改为.txt
.注意:Greg Hewgill正确地指出这不是一个bash内置;并且是一个单独的Linux命令 . 如果你只需要Linux上的东西,这应该可以正常工作;如果您需要更多跨平台的东西,那么请看一下其他答案 .
这在OSX上起作用,从.txt到.txt_bak
在Mac上......
如果您还没有安装rename:
brew install rename
rename -S .html .txt *.html
对于Ubuntu用户:
以下是重命名命令的示例:
-n表示它是一个测试运行,实际上不会更改任何文件 . 它将显示一个文件列表,如果删除了-n,将重命名这些文件 . 在上面的例子中,它会将当前目录中的所有文件从.htm的文件扩展名转换为.html .
如果上面测试运行的输出看起来没问题,那么你可以运行最终版本:
-v是可选的,但包含它是个好主意,因为它是你将拥有的重命名命令所做的更改的唯一记录,如下面的示例输出所示:
中间的棘手部分是使用正则表达式的Perl替换,突出显示如下:
在其他人的网站抓取之后,我最终在数据库中找到了数千个缺少.html扩展名的文件 .
要一次性重命名它们,除了已经有.html扩展名的文件(大多数都没有),这对我有用:
在OP的情况下,我可能稍微修改一下,只重命名* .txt文件,如下所示:
分解(hammertime!):
-iname * .txt
mv -iv "{}.{txt,html}" - 当 find 传递{}作为文件名时,$ {filename% . *}提取其基本名称而没有任何扩展名,以形成 mv 的参数 . bash 使用{txt,html}将其重写为两个参数,因此最终命令运行为:
mv -iv "filename.txt" "filename.html"
但需要修复:处理文件名中的空格
command mmv似乎在大量文件上非常有效地完成了这项任务(一秒钟内成千上万) . 例如,要将所有
.xml
文件重命名为.html
文件,请使用以下命令:;
将匹配路径,*
将匹配文件名,这些在替换名称中称为#1
和#2
.基于
exec
或管道的答案要么太慢,要么在大量文件上失败 .如果您更喜欢PERL,那么有一个简短的PERL脚本(由PERL的创建者Larry Wall编写),它将完全符合您的要求:tips.webdesign10.com/files/rename.pl.txt . 对于您的示例,以下应该可以解决问题
rename.pl 's/html/txt/' *.html
=)
(感谢@loretoparisi获取更新后的网址)
不幸的是,做便携并不是一件容易的事 . 你可能需要一些expr魔法 .
一旦你开心它就能做你想做的事情,就去除回声 .
Edit:
basename
对于这种特殊情况可能更具可读性,尽管expr
一般来说更灵活 .这是我用来将
.edge
文件重命名为.blade.php
的内容像魅力一样工作 .
这是一次修改多个扩展的好方法:
注意:小心扩展大小要一样(???)