在目录中,我有一堆*.html
文件。
我想他们都重命名为*.txt
我用的是bash shell的。
在目录中,我有一堆*.html
文件。
我想他们都重命名为*.txt
我用的是bash shell的。
对于一个更好的解决方案(只bash的功能,而不是外部调用),看到其他的答案之一 。
下面会做,并且不要求系统具有rename
程序(虽然你会经常有这样的系统上):
for file in *.html; do
mv "$file" "$(basename "$file" .html).txt"
done
编辑:正如在评论中指出,这不适合带空格的文件名不正确的引用(现在上面添加)工作。 当你知道没有在文件名中的空间,这将工作,但每当你写的东西,可能在以后的时间被重用,不要跳过适当引用自己的文件纯属工作。
如果使用bash,有没有必要像sed,基本名称,重命名,EXPR等外部命令
for file in *.html
do
mv "$file" "${file%.html}.txt"
done
rename 's/\.html$/\.txt/' *.html
不正是你想要的。
这为我工作在OSX从.txt到.txt_bak
find . -name '*.txt' -exec sh -c 'mv "$0" "${0%.txt}.txt_bak"' {} \;
你想用rename
:
rename -S .html .txt *.html
这不正是你想要的东西-这将延长从更改.html
到.txt
匹配的所有文件*.html
。
注:格雷格Hewgill正确地指出,这不是一个bash内建; 是一个独立的Linux命令。 如果你只需要在Linux上的东西这应该做工精细; 如果你需要更多的东西跨平台再看看其他的答案之一。
在Mac ...
brew install rename
rename -S .html .txt *.html
对于Ubuntu的用户:
rename 's/\.html$/\.txt/' *.html
下面是重命名的命令的例子:
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替代正则表达式,下面突出显示:
rename -v ’s/\.htm$/\.html/’ *.htm
别人的网站抓取之后,我结束了成千上万的文件丢失.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
- 手段只考虑文件中的.txt已经结束
MV -IV “{} {TXT,HTML}。” - {名%*}当发现一个传递{}作为文件名,$抽取出它的基本名称,没有任何扩展而形成的参数MV。 bash中取{TXT,HTML}重写它作为两个参数,因此最后的命令运行为: mv -iv "filename.txt" "filename.html"
修复需要,但:有空格的文件名处理
这个问题明确提到猛砸,但如果你碰巧有ZSH可用它是非常简单的:
zmv '(*).*' '$1.txt'
如果你得到zsh: command not found: zmv
然后只需运行:
autoload -U zmv
然后再次尝试。
由于这个原来的文章有关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' - '{}' \;
该命令mmv
似乎非常有效地完成此任务的文件(数以万计的第二个)一个巨大的数字。 例如,要重命名所有.xml
文件.html
文件,使用这样的:
mmv ";*.xml" "#1#2.html"
的;
将匹配的路径中, *
将匹配的文件名,并且这些被称为#1
和#2
在更换名称。
基于答案exec
或管道要么太慢或失败的一个非常大的数字文件。
试试这个
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' - {}
如果你喜欢PERL,有一个短暂的PERL脚本(由Larry Wall,Perl的创造者orignally写的),会做正是你想要的位置: tips.webdesign10.com/files/rename.pl.txt 。 对于示例下面应该做的伎俩
rename.pl 's/html/txt/' *.html
=)
(感谢@loretoparisi的更新URL)
遗憾的是它不平凡的可移植做。 你可能需要一点点的EXPR魔法。
for file in *.html; do echo mv -- "$file" "$(expr "$file" : '\(.*\)\.html').txt"; done
删除回声一旦你开心呢,你想要做什么。
编辑: basename
可能是针对这种特殊情况下有点更具可读性,虽然expr
是一般更灵活。
这是一次修改多个扩展名的好方法:
for fname in *.{mp4,avi}
do
mv -v "$fname" "${fname%.???}.mkv"
done
注意:要小心的扩展大小是相同的(在???)
这里是我用来命名.edge
文件.blade.php
for file in *.edge; do mv "$file" "$(basename "$file" .edge).blade.php"; done
工程就像魅力。
尼斯和简单!
find . -iname *.html -exec mv {} "$(basename {} .html).text" \;