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


12

我的文件夹中有很多文件,我想给它们添加前缀或后缀(不是全部)。我在这里检查后发现可以使用

for filename in *.jpg; do mv "$filename" "prefix_$filename"; done;

为所有结尾的文件添加前缀.jpg(如果删除.jpg,它将为当前文件夹中的所有文件添加前缀)。

但是,我希望能够

  • 添加后缀(即重命名filename.extfilename.whatever.ext),
  • 检查前缀或后缀是否已经存在,然后跳过,
  • 创建接受参数,如别名addprefix whatever *.extaddsufix whatever *.*

Answers:


10

如果您使用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

那几乎是完美的!如果它(1)检查前缀或后缀是否已经存在(然后跳过),以及(2)在没有扩展名的文件上工作,那将是完美的。很抱歉打扰这么多……
巴西的Guy

对于(1),您可以(我认为,未经测试)通过将mv包裹在中来添加前缀检查,if [ $f == $prefix* ]然后可以if [ $f == *$suffix$([ ! -z $extension ] && echo -n '.')$extension ]在addsuffix中使用几个mv命令来更改后缀一个。对于(2),它应该已经可以处理没有扩展名的文件,除非我是一个可怕的程序员。
亚伦·冈野

7

有一个Perl rename命令应该可以解决问题。但是要当心:有几个称为的不同命令rename,因此请确保您已经获得了以a perlexpr作为参数的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有点难,因为您必须弄清楚文件名的哪一部分构成了扩展名...


这是一个很好的答案,但是我正在寻找更通用的东西。对于此答案,您需要同时存在perl和此特定(或等效)的内容rename。而且我知道后缀会更难一些,链接的问题中没有涉及到。我是linux,bash,shell脚本,perl和正则表达式的初学者,所以“难一些”对我来说很难!:)
那位巴西佬

4

zsh

autoload zmv # in ~/.zshrc
zmv '(*~*suffix).ext' '${1}suffix.ext'

~是通配操作者的装置除外zsh


1

更改当前文件夹中所有图像的前缀和扩展名的简单示例。

prefix=EG_
extension=.jpg
for i in $(ls); do mv $i "$prefix${i%.JPG}$extension";  done

如果要在更改之前检查它会如何影响数据,请用echo替换mv

IMG_7993.JPG的输出是EG_IMG_7993.jpg

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.