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

这是我的代码:

files=`ls -1 *.txt`

for x in $files
do
    mv $x "`basename $files .txt`.text"
done


我正在收到此错误:

 basename: too many arguments Try basename --help' for more information
 


评论

peteryu.ca/tutorials/shellscripting/batch_rename的一些想法也

#1 楼

直接来自Greg的Wiki:

# Rename all *.txt to *.text
for f in *.txt; do 
    mv -- "$f" "${f%.txt}.text"
done


另请参阅为何不分析ls的条目。

编辑:如果必须使用basename,您的语法应为:

for f in *.txt; do
    mv -- "$f" "$(basename -- "$f" .txt).text"
done


评论


这里使用了一些稍微高级的Bash语法,没有说明。我必须对Google做很多事情才能充分理解这一点。为了帮助其他人保持我的位置,以下是有关glob(*。txt语法),双破折号-以及$ {}构造中%符号的使用的一些参考。到现在为止,我从未遇到过后两者,并且不知道前者真正发生了什么。

– Mark Amery
2014-09-21 12:32



请看下面Matthias Braun的答案-简单得多,完成同样的事情。

–btk
2015年3月10日14:38

* .txt中f的一个底线;做MV-“ $ f”“ $ {f%.txt} .text”;完成

–马萨尔·胡安(MarçalJuan)
2015年10月21日在14:35

@PéturIngiEgilsson在第二行?不,不是必需的。

– Jasonwryan
17年1月28日在8:33

-代表什么?

–微积分
18-10-28在5:25

#2 楼

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

rename "s/oldExtension/newExtension/" *.txt


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

评论


比接受的答案简单得多,谢谢!

–btk
2015年3月10日14:37

在Mac上,我可以执行brew install重命名并使其正常工作。

– Monkpit
16年7月19日在14:42

使用鱼壳,您可以重命名“ s / oldExtension / newExtension /” **。txt以递归重命名所有* .txt

–MatějŠmíd
17年2月16日在13:03

footxt.txt将失败。改用它:unix.stackexchange.com/questions/19654/…

– Wisbucky
17年8月1日在23:57

当您的文件没有任何扩展名而您想添加一个扩展名时:重命名's / $ /。txt /'*

–mkataja
17年8月2日在7:21

#3 楼

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


评论


重命名会第一次发生更改,因此最好将其重命名为.txt .text,但这仍然无法始终有效(例如,将foo.txtx.bar.txt重命名为foo.textx.bar.txt)。

–吉尔斯'所以-不再是邪恶的'
11年8月29日在21:28

应该注意的是,并非所有系统都具有相同版本的重命名。在Debian和朋友上,重命名命令实际上是perl-rename,并使用perl正则表达式。为此,等效命令为:重命名's / .txt / .text /'* .txt。人们应该在系统上检查该人的重命名,以找到他们拥有的那个人。

– evilsoup
13年13月13日在15:12

@evilsoup OSX就是这种情况,thx

–戴维·利马(Davi Lima)
15年8月17日在19:23

这也适用于Cygwin(Windows)

–安迪
17年4月12日在9:36

#4 楼

rename "s/oldExtension/newExtension/" *.txt

以上工作正常,但仅限于当前目录。请尝试下面的命令,该命令对于子目录很灵活。它将使用新扩展名重命名目录结构下的所有.txt文件。
find . -type f -name "*.txt" -exec rename 's/\.txt$/.newext/' '{}' \;


评论


重命名可以处理多个文件作为参数,通过使用+而不是\可以极大地加快处理速度;如果有很多这样的文件

–安东
2015年2月17日在8:57



仍然是一个有用的选项,因为“ * .txt”可以展开到外壳程序不支持的大参数列表。

–罗马·夏波娃洛夫
16-10-19在13:14

footxt.txt的“ s / oldExtension / newExtension /”将失败。改用它:unix.stackexchange.com/questions/19654/…

– Wisbucky
17年8月1日在23:59

#5 楼

此处引用s/oldExtension/newExtension/的答案是错误的。如果使用s/txt/text/,则会将footxt.txt转换为footext.txt,这不是您想要的。即使使用s/.txt/.text/,也会将footxt.txt转换为fo.text.txt。和结尾的\.匹配行尾。只有这样才能正确匹配扩展名。

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

rename 's/\.old$/.new/' *.old


#6 楼

for f in *.txt
do
    [ -f "$f" ] && mv "$f" "${f%txt}text"
done


#7 楼

基于@Prince John Wesley的答案,这是一个简单的bash脚本,用于将当前目录中文件的所有扩展名从ext1更改为ext2。还输出重命名文件的名称。

#!/bin/bash
for f in *.
do
    [ -f "$f" ] && mv -v "$f" "${f%}"
done


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

change-ext ext1 ext2


评论


要递归更改目录中文件的扩展名,请用两行替换第二行(for ...):shopt -s globstar和** / *。$ 1中的f。需要Bash 4+。

–丹尼斯·戈洛马佐夫(Dennis Golomazov)
2012年2月2日上午10:40

#8 楼

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

for f in `find /dirx -iname '*.txt' -type f -print`;do  mv "$f" ${f%.txt}.text; done


评论


那tcsh呢..

–约瑟夫·克利穆克(Josef Klimuk)
18年7月15日在16:37

#9 楼

原因#53切换到zsh:

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

#10 楼

在Ubuntu 18.04上,util-linux重命名命令可作为rename.ul使用。这对我有用:
rename.ul -o -v .oldext .newext *.oldext

选项:

-o:禁止覆盖
-v:详细
-n:空运行

有关更多信息,请参阅man rename.ulrename.ul -h

#11 楼

当您


没有源文件的扩展名


并且目标扩展名是.text时,您可以这样-

for f in *; do mv -- "$f" "${f%.\*}.text"; done


评论


出色的bash原生脚本。很棒! * .html中的f做MV-“ $ f”“ $ {f%。\ *}。pug”;完成

– TamusJRoyce
19年7月19日在17:54



#12 楼

这对我有用:

find . -name '*.txt' -exec rename 's/\.txt$/.text/' \{} \;


#13 楼

如果您想知道版本中出了什么问题:您在basename命令中使用了$files而不是$x。因此,这应该起作用(不过,未经测试):
for x in *.txt
do
  mv "$x" "`basename "$x" .txt`.text"
done


评论


谢谢,@ fra-san!

–丹尼尔·库尔曼
20-10-30在11:03