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)
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来使其工作。
lam*_*988 62
一个简单的命令renamefromutil-linux将为您完成此操作,它将所有匹配“*.txt”的文件中的“txt”替换为“text”:
rename txt text *.txt
Run Code Online (Sandbox Code Playgroud)
小智 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)
wis*_*cky 29
这里引用的答案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
Run Code Online (Sandbox Code Playgroud)
Bur*_*ito 13
原因 #53 切换到 zsh:
zmv '(*).txt' '$1.text'
小智 12
基于该@Prince约翰·卫斯理的答案,这里是更改文件的所有扩展在当前目录下一个简单的bash脚本ext1来ext2。还输出被重命名的文件的名称。
#!/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)
在 Ubuntu 18.04 上,util-linux rename 命令可用作rename.ul. 这对我有用:
rename.ul -o -v .oldext .newext *.oldext
Run Code Online (Sandbox Code Playgroud)
选项:
有关详细信息,请参阅man rename.ul或rename.ul -h。
这对我有用:
find . -name '*.txt' -exec rename 's/\.txt$/.text/' \{} \;
Run Code Online (Sandbox Code Playgroud)
如果您想知道您的版本出了什么问题:您在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)
Mmv(在主要发行版存储库中可用)对于重命名也非常有用。给出引号中的模式,每个 glob 元素都可以通过以下方式重现#N:
mmv '*.txt' '#1.text'
Run Code Online (Sandbox Code Playgroud)
手册页中有一些更有趣、简洁的示例:
.html.en将以、等结尾的文件重命名.html.de为以.en.html、.de.html等结尾:Run Code Online (Sandbox Code Playgroud)mmv '*.html.??' '#1.#2#3.html'将音乐文件重命名
<track no.> - <interpreter> - <song title>.ogg为<interpreter> - <track no.> - <song title>.ogg:Run Code Online (Sandbox Code Playgroud)mmv '* - * - *.ogg' '#2 - #1 - #3.ogg'
| 归档时间: |
|
| 查看次数: |
441035 次 |
| 最近记录: |