题
在一个目录中,我有一堆 *.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,将被重命名的文件列表。在上面的情况下,它都将文件转换在当前目录中从热媒为.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
注意:小心在延伸尺寸是相同的(在???)
尼斯&简单!
find . -iname *.html -exec mv {} "$(basename {} .html).text" \;
下面是我用于重命名.edge
文件.blade.php
for file in *.edge; do mv "$file" "$(basename "$file" .edge).blade.php"; done
工程就像魅力。
一条线路,没有循环:
ls -1 | xargs -L 1 -I {} bash -c 'mv $1 "${1%.*}.txt"' _ {}
cbongiorno@ip-172-31-26-242:~/pgsql$ ls
60acbc4d-3a75-4090-85ad-b7d027df8145.json ac8453e2-0d82-4d43-b80e-205edb754700.json
cbongiorno@ip-172-31-26-242:~/pgsql$ ls -1 | xargs -L 1 -I {} bash -c 'mv $1 "${1%.*}.txt"' _ {}
cbongiorno@ip-172-31-26-242:~/pgsql$ ls
60acbc4d-3a75-4090-85ad-b7d027df8145.txt ac8453e2-0d82-4d43-b80e-205edb754700.txt
cbongiorno@ip-172-31-26-242:~/pgsql$