我的文件夹中有很多文件,我想添加前缀或后缀(不是两个都) 给他们。我检查了这里发现我可以使用
for filename in *.jpg; do mv "$filename" "prefix_$filename"; done;
为所有以 结尾的文件添加前缀.jpg
(如果我删除.jpg
,它会将前缀添加到当前文件夹中的所有文件)。
但是,我希望能够
- 添加后缀(即重命名
filename.ext
为filename.whatever.ext
), - 检查前缀或后缀是否已经存在然后跳过,
- 创建一个接受参数的别名,例如
addprefix whatever *.ext
或addsufix whatever *.*
答案1
如果您正在使用bash
,那么这个单行代码可以为您完成(假设您有变量$prefix
,$suffix
并且$extension
随时可用)
mv "$filename" "$prefix${filename%.$extension}$suffix.$extension"
你可以让你的脚本像这样
#!/bin/bash
# Usage: addprefix <prefix> <files>
prefix=$1
shift
for f in "$@"
do
mv "$f" "$prefix$f"
done
和
#!/bin/bash
# addsuffix <suffix> <files>
suffix=$1
shift
for f in "$@"
do
extension=${f##*.}
if [ -z $extension ]; then
mv "$f" "$f$suffix"
else
mv "$f" "${f%.$extension}$suffix.$extension"
fi
done
答案2
有一个Perlrename
命令这应该够了吧。但请注意:有多个不同的命令称为rename
,因此请确保您拥有需要 aperlexpr
作为其参数的 Perl 脚本。这是Debian 及其衍生版本(Ubuntu、Mint 等)上的软件包rename
提供的命令,但其他发行版上则没有,这些发行版可能具有名为 的不同实用程序。perl
rename
martin@martin ~/test % touch a.txt
martin@martin ~/test % touch b.txt
martin@martin ~/test % rename 's/^(prefix)?/prefix/' *.txt
martin@martin ~/test % ll
insgesamt 0
-rw-rw-r-- 1 martin martin 0 Sep 19 23:56 prefixa.txt
-rw-rw-r-- 1 martin martin 0 Sep 19 23:56 prefixb.txt
martin@martin ~/test % rename 's/^(prefix)?/prefix/' *.txt
martin@martin ~/test % ll
insgesamt 0
-rw-rw-r-- 1 martin martin 0 Sep 19 23:56 prefixa.txt
-rw-rw-r-- 1 martin martin 0 Sep 19 23:56 prefixb.txt
正如你所看到的,它是幂等的- 多次调用时不会再次添加前缀。
它的工作原理是替换字符串的(零长度)开头 ( ^
) 或将开头后跟可选prefix
字符串替换为prefix
。
我将把它封装在 shell 脚本或 shell 函数中作为您的练习:)
不过 Postfix 有点难,因为你必须弄清楚文件名的哪一部分构成扩展名......
答案3
和zsh
:
autoload zmv # in ~/.zshrc
zmv '(*~*suffix).ext' '${1}suffix.ext'
~
是通配符,这意味着除了在zsh
。
答案4
更改当前文件夹中所有图像的前缀和扩展名的简单示例。
prefix=EG_
extension=.jpg
for i in $(ls); do mv $i "$prefix${i%.JPG}$extension"; done
如果您想在更改之前检查它如何影响您的数据,请替换MV经过回声
IMG_7993.JPG 的输出是 EG_IMG_7993.jpg