重命名本地文件夹中的文件添加前缀或后缀

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.extfilename.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)


Mar*_*ich 7

有一个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 有点难,因为您必须弄清楚文件名的哪一部分构成了扩展名...


Sté*_*las 5

zsh

autoload zmv # in ~/.zshrc
zmv '(*~*suffix).ext' '${1}suffix.ext'
Run Code Online (Sandbox Code Playgroud)

~是通配符,表示except in zsh