*.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
#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 楼
一个简单的命令,即来自rename
的util-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.ul
或rename.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
评论
peteryu.ca/tutorials/shellscripting/batch_rename的一些想法也