如何更改多个文件的扩展名?

afb*_*201 289 bash shell-script rename

我想从改变文件扩展名*.txt*.text。我尝试使用该basename命令,但在更改多个文件时遇到问题。

这是我的代码:

files=`ls -1 *.txt`

for x in $files
do
    mv $x "`basename $files .txt`.text"
done
Run Code Online (Sandbox Code Playgroud)

我收到此错误:

files=`ls -1 *.txt`

for x in $files
do
    mv $x "`basename $files .txt`.text"
done
Run Code Online (Sandbox Code Playgroud)

jas*_*yan 359

直接来自Greg 的 Wiki

# Rename all *.txt to *.text
for f in *.txt; do 
    mv -- "$f" "${f%.txt}.text"
done
Run Code Online (Sandbox Code Playgroud)

*.txt一个*通配模式,用作通配符来匹配任何字符串。*.txt匹配所有以“.txt”结尾的文件名。

-- 标记选项列表的结尾。这避免了文件名以连字符开头的问题。

${f%.txt}一个参数扩展,替换为从末尾移除的f变量的值.txt

另请参阅有关为什么不应该 parsels的条目。

如果必须使用basename,则语法为:

for f in *.txt; do
    mv -- "$f" "$(basename -- "$f" .txt).text"
done
Run Code Online (Sandbox Code Playgroud)

  • 一行```for f in *.txt; do mv -- "$f" "${f%.txt}.text"; 完成了``` (44认同)
  • 对于那些找到这个答案的人,请注意,如果您“错误地”在“参数扩展”语法中用括号替换花括号,它将删除您的文件。不要犯像我一样的错误(幸运的是我使用了测试目录)。 (4认同)

Mat*_*aun 202

这是我如何更改 Debian 上当前目录中的所有文件扩展名。

rename "s/oldExtension$/newExtension/" *.txt
Run Code Online (Sandbox Code Playgroud)

(这是 Perlrename命令,而不是那个util-linux。请参阅为什么 Debian/Ubuntu 上的重命名实用程序与其他发行版(如 CentOS上的不同?

在 MacOS 上,用户Monkpit报告说他们能够使用它brew install rename来使其工作。

  • 当您的文件没有任何扩展名而您想添加一个时:`rename 's/$/.txt/' *` (9认同)
  • 使用鱼壳,您可以执行`rename "s/oldExtension/newExtension/" **.txt` 以递归方式重命名所有 *.txt (4认同)

lam*_*988 62

一个简单的命令renamefromutil-linux将为您完成此操作,它将所有匹配“*.txt”的文件中的“txt”替换为“text”:

rename txt text *.txt
Run Code Online (Sandbox Code Playgroud)

  • 需要注意的是,并非所有系统都具有相同版本的rename;在 Debian 和朋友上,`rename` 命令实际上是 `perl-rename` 并使用 perl 正则表达式。为此,等效的命令是:`rename 's/.txt/.text/' *.txt`。人们应该检查他们系统上的“man rename”以找出他们拥有的是哪一个。 (19认同)
  • `rename` 改变了第一次出现,所以最好让 `rename .txt .text`,但这仍然不会总是有效(例如,它将 `foo.txtx.bar.txt` 重命名为 `foo.textx.bar.txt `)。 (7认同)

小智 48

rename "s/oldExtension/newExtension/" *.txt
Run Code Online (Sandbox Code Playgroud)

以上工作正常,但仅限于当前目录。试试下面的命令,它对子目录很灵活。它将.txt使用新的扩展名重命名目录结构下的所有文件。

find . -type f -name "*.txt" -exec rename 's/\.txt$/.newext/' '{}' \;
Run Code Online (Sandbox Code Playgroud)

  • “s/oldExtension/newExtension/”对于 `footxt.txt` 将失败。使用此代替:https://unix.stackexchange.com/questions/19654/changing-extension-to-multiple-files/383321#383321 (5认同)
  • `rename` 可以处理多个文件作为参数,如果有很多这样的文件,你可以使用 `+` 而不是 `\;` 来大大加快速度 (3认同)

wis*_*cky 29

这里引用的答案s/oldExtension/newExtension/是错误的。如果您使用s/txt/text/,您将转换footxt.txtfootext.txt,这不是您想要的。即使您使用s/.txt/.text/,那也会转换footxt.txtfo.text.txt.

您必须使用\.来匹配句点(.将匹配任何字符)。和尾随$匹配行尾。只有这样才能正确匹配扩展名。

rename 's/\.txt$/.text/' *.txt

rename 's/\.old$/.new/' *.old
Run Code Online (Sandbox Code Playgroud)


Bur*_*ito 13

原因 #53 切换到 zsh:

zmv '(*).txt' '$1.text'

  • 对于 Mac,我必须运行此命令“autoload -U zmv”。否则,我会收到“zsh:找不到命令:zmv” (10认同)

小智 12

基于该@Prince约翰·卫斯理的答案,这里是更改文件的所有扩展在当前目录下一个简单的bash脚本ext1ext2。还输出被重命名的文件的名称。

#!/bin/bash
for f in *.$1
do
    [ -f "$f" ] && mv -v "$f" "${f%$1}$2"
done
Run Code Online (Sandbox Code Playgroud)

用法示例(假设脚本名称为change-ext):

change-ext ext1 ext2
Run Code Online (Sandbox Code Playgroud)


Pri*_*ley 11

for f in *.txt
do
    [ -f "$f" ] && mv "$f" "${f%txt}text"
done
Run Code Online (Sandbox Code Playgroud)


小智 9

假设您的文件分散在各个目录中,假设 dirx 是您的父目录,这可以使用 find 完成这项工作:

for f in `find /dirx -iname '*.txt' -type f -print`;do  mv "$f" ${f%.txt}.text; done
Run Code Online (Sandbox Code Playgroud)


Asc*_*ius 8

在 Ubuntu 18.04 上,util-linux rename 命令可用作rename.ul. 这对我有用:

rename.ul -o -v .oldext .newext *.oldext
Run Code Online (Sandbox Code Playgroud)

选项:

  • -o:不要覆盖预先存在的 .newext
  • -v:详细
  • -n:试运行

有关详细信息,请参阅man rename.ulrename.ul -h


yeg*_*256 6

这对我有用:

find . -name '*.txt' -exec rename 's/\.txt$/.text/' \{} \;
Run Code Online (Sandbox Code Playgroud)


dan*_*ann 5

如果您想知道您的版本出了什么问题:您在basename命令中使用了$files而不是。$x所以这应该有效(尽管未经测试):

for x in *.txt
do
  mv "$x" "`basename "$x" .txt`.text"
done
Run Code Online (Sandbox Code Playgroud)


小智 5

当你

没有源文件的扩展名

目标扩展名是.text你会这样做 -

for f in *; do mv -- "$f" "${f%.\*}.text"; done
Run Code Online (Sandbox Code Playgroud)

  • 这不会更改扩展名。它增加了它。您必须使用 basename 来提取文件名的基本部分。 (2认同)

Qua*_*odo 5

Mmv(在主要发行版存储库中可用)对于重命名也非常有用。给出引号中的模式,每个 glob 元素都可以通过以下方式重现#N

mmv '*.txt' '#1.text'
Run Code Online (Sandbox Code Playgroud)

手册页中有一些更有趣、简洁的示例:

.html.en将以、等结尾的文件重命名.html.de为以.en.html.de.html等结尾:

mmv '*.html.??' '#1.#2#3.html' 
Run Code Online (Sandbox Code Playgroud)

将音乐文件重命名<track no.> - <interpreter> - <song title>.ogg<interpreter> - <track no.> - <song title>.ogg

mmv '* - * - *.ogg' '#2 - #1 - #3.ogg' 
Run Code Online (Sandbox Code Playgroud)