Tha*_*Guy 13 shell shell-script rename
我在一个文件夹中有很多文件,我想为它们添加前缀或后缀(不是两者)。我在这里检查并发现我可以使用
for filename in *.jpg; do mv "$filename" "prefix_$filename"; done;
Run Code Online (Sandbox Code Playgroud)
为所有以 结尾的文件添加前缀.jpg
(如果我删除.jpg
,它将为当前文件夹中的所有文件添加前缀)。
但是,我希望能够
filename.ext
为filename.whatever.ext
),addprefix whatever *.ext
或的参数的别名addsufix whatever *.*
小智 11
如果您正在使用bash
,那么这个单线可以为您完成(假设您有变量$prefix
,$suffix
并且$extension
随时可用)
mv "$filename" "$prefix${filename%.$extension}$suffix.$extension"
Run Code Online (Sandbox Code Playgroud)
你可以让你的脚本是这样的
#!/bin/bash
# Usage: addprefix <prefix> <files>
prefix=$1
shift
for f in "$@"
do
mv "$f" "$prefix$f"
done
Run Code Online (Sandbox Code Playgroud)
和
#!/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
Run Code Online (Sandbox Code Playgroud)
有一个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
Run Code Online (Sandbox Code Playgroud)
如您所见,它是幂等的- 当您多次调用它时,它不会再次添加前缀。
它的工作方式是替换字符串 ( ^
)的(零长度)开头或开头后跟可选prefix
字符串的prefix
.
我将把它封装在 shell 脚本或 shell 函数中作为练习:)
不过,Postfix 有点难,因为您必须弄清楚文件名的哪一部分构成了扩展名...
和zsh
:
autoload zmv # in ~/.zshrc
zmv '(*~*suffix).ext' '${1}suffix.ext'
Run Code Online (Sandbox Code Playgroud)
~
是通配符,表示except in zsh
。