在一个目录中,我有一堆 *.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 上...

  1. 安装 改名 如果你还没有: brew install rename
  2. 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$ 
许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top