如何用前缀/后缀重命名?

Pet*_*ton 87 bash filenames rename mv prefix

如何在mv original.filename new.original.filename不重新输入原始文件名的情况下进行操作?

我会想象能够做这样的事情mv -p=new. original.filename或者是mv original.filename new.~或什么-但看后,我看不出这样的事情man mv/ info mv页.

当然,我可以编写一个shell脚本来执行此操作,但是不存在现有的命令/标志吗?

Sim*_*ann 143

您可以使用rename(1)命令:

rename 's/(.*)$/new.$1/' original.filename
Run Code Online (Sandbox Code Playgroud)

编辑:如果重命名不可用,并且您必须重命名多个文件,那么shell脚本可以简单而简单.例如,要将当前目录中的所有.jpg重命名为prefix_ .jpg:

for filename in *.jpg; do mv "$filename" "prefix_$filename"; done;
Run Code Online (Sandbox Code Playgroud)

  • 到目前为止,这是最好的答案. (2认同)
  • 我认为在这种情况下您不需要第一个 `$`。所以只是`'s/(.*)/new.$1/'` (2认同)

Dav*_*ebb 114

在Bash和zsh中,您可以使用Brace Expansion执行此操作.这只是扩展大括号中的项目列表.例如:

# echo {vanilla,chocolate,strawberry}-ice-cream
vanilla-ice-cream chocolate-ice-cream strawberry-ice-cream
Run Code Online (Sandbox Code Playgroud)

所以你可以按如下方式重命名:

mv {,new.}original.filename
Run Code Online (Sandbox Code Playgroud)

因为这扩展到:

mv original.filename new.original.filename
Run Code Online (Sandbox Code Playgroud)

  • 这不做的是使用外卡.也就是说,在包含文件名a,b,c的目录中,使用"echo {,new.}*"产生列表"abc new.*"(因为通过大括号扩展生成文件名在扩展通配符之前发生 - 至少通过推论). (28认同)

小智 25

您可以通过创建for循环来实现与unix兼容的多文件重命名(使用通配符):

for file in *; do
  mv $file new.${file%%}
done
Run Code Online (Sandbox Code Playgroud)

  • 这与[Simon Lehmann已经回答的](http://stackoverflow.com/questions/208181/how-to-rename-with-prefix-suffix#208220)有什么区别? (7认同)
  • 这非常有效.什么```$ {file %%}```做什么?看起来类似于$ {file} (4认同)
  • [“%%”对我来说看起来像是一个错误](/sf/answers/2446640661/) (2认同)

Jon*_*ler 10

我见过人们提到了一个rename命令,但在Unix系统上并不是常规可用的(而不是Linux系统,比如说,或者Cygwin - 在这两个系统上,重命名是可执行文件而不是脚本).该版本的rename功能相当有限:

rename from to file ...
Run Code Online (Sandbox Code Playgroud)

它用to替换文件名的from部分,手册页中给出的示例是:

rename foo foo0 foo? foo??
Run Code Online (Sandbox Code Playgroud)

这将foo1重命名为foo01,将foo10重命名为foo010等.

我使用一个名为Perl的脚本rename,我最初从第一版Camel书中挖出,大约在1992年,然后扩展,重命名文件.

#!/bin/perl -w
#
# @(#)$Id: rename.pl,v 1.7 2008/02/16 07:53:08 jleffler Exp $
#
# Rename files using a Perl substitute or transliterate command

use strict;
use Getopt::Std;

my(%opts);
my($usage) = "Usage: $0 [-fnxV] perlexpr [filenames]\n";
my($force) = 0;
my($noexc) = 0;
my($trace) = 0;

die $usage unless getopts('fnxV', \%opts);

if ($opts{V})
{
    printf "%s\n", q'RENAME Version $Revision: 1.7 $ ($Date: 2008/02/16 07:53:08 $)';
    exit 0;
}
$force = 1 if ($opts{f});
$noexc = 1 if ($opts{n});
$trace = 1 if ($opts{x});

my($op) = shift;
die $usage unless defined $op;

if (!@ARGV) {
    @ARGV = <STDIN>;
    chop(@ARGV);
}

for (@ARGV)
{
    if (-e $_ || -l $_)
    {
        my($was) = $_;
        eval $op;
        die $@ if $@;
        next if ($was eq $_);
        if ($force == 0 && -f $_)
        {
            print STDERR "rename failed: $was - $_ exists\n";
        }
        else
        {
            print "+ $was --> $_\n" if $trace;
            print STDERR "rename failed: $was - $!\n"
                unless ($noexc || rename($was, $_));
        }
    }
    else
    {
        print STDERR "$_ - $!\n";
    }
}
Run Code Online (Sandbox Code Playgroud)

这允许您编写任何Perl替换或音译命令来映射文件名.在请求的具体示例中,您将使用:

rename 's/^/new./' original.filename
Run Code Online (Sandbox Code Playgroud)


小智 8

批量重命名目录中文件的最简单方法是:

ls | xargs -I fileName mv fileName fileName.suffix
Run Code Online (Sandbox Code Playgroud)


yey*_*eya 8

我知道这里有很好的答案,但我没有找到在添加后缀时处理文件扩展名的参考。

我需要wav在文件扩展名之前为文件夹中的所有文件添加“_en”后缀。

魔法就在这里:%.*

for filename in *.wav; do mv $filename ${filename%.*}_en.wav; done;

如果您需要处理不同的文件扩展名,请检查答案。有点不太直观。