代码之家  ›  专栏  ›  技术社区  ›  Peter Boughton

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

  •  76
  • Peter Boughton  · 技术社区  · 16 年前

    我该怎么办 mv original.filename new.original.filename 不重新输入原始文件名?

    我可以想象能做些什么 mv -p=new. original.filename 或者也许 mv original.filename new.~ 或者别的什么-但是我看了之后就看不到这样的东西了 man mv / info mv 页。

    当然,我可以编写一个shell脚本来实现这一点,但它是否有一个现有的命令/标志?

    8 回复  |  直到 6 年前
        1
  •  105
  •   David Webb    16 年前

    在bash和zsh中,您可以使用 Brace Expansion . 这只需扩展大括号中的项目列表。例如:

    # echo {vanilla,chocolate,strawberry}-ice-cream
    vanilla-ice-cream chocolate-ice-cream strawberry-ice-cream
    

    因此,您可以按如下方式进行重命名:

    mv {,new.}original.filename
    

    当这扩展到:

    mv original.filename new.original.filename
    
        2
  •  121
  •   Simon Lehmann    16 年前

    可以使用rename(1)命令:

    rename 's/(.*)$/new.$1/' original.filename
    

    编辑: 如果重命名不可用,并且您必须重命名多个文件,那么shell脚本就可以做到这一点。例如,重命名所有 JPG到前缀 .jpg在当前目录中:

    for filename in *.jpg; do mv "$filename" "prefix_$filename"; done;
    
        3
  •  24
  •   A Muguro    12 年前

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

    for file in *; do
      mv $file new.${file%%}
    done
    
        4
  •  8
  •   Jonathan Leffler Toon Krijthe    16 年前

    我见过有人提到 rename 命令,但它在UNIX系统上通常不可用(与Linux系统不同,例如,或cygwin,在这两个系统上,rename都是可执行的而不是脚本)。那个版本 重命名 功能相当有限:

    rename from to file ...
    

    它取代了 文件名的一部分 ,手册页中给出的示例是:

    rename foo foo0 foo? foo??
    

    将foo1重命名为foo01,将foo10重命名为foo010等。

    我使用一个名为 重命名 它最初是我从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";
        }
    }
    

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

    rename 's/^/new./' original.filename
    
        5
  •  2
  •   workmad3    16 年前

    如果可以修改,可以使用后缀而不是前缀。然后可以使用制表符完成获取原始文件名并添加后缀。

    否则,不,这不是mv命令支持的内容。不过,一个简单的shell脚本可以应付。

        6
  •  1
  •   aprodan    8 年前

    在我的例子中,我有一组文件需要重命名才能使用它们。每个文件在组中都有自己的角色,并且有自己的模式。

    因此,我有一个这样的重命名命令列表:

    f=`ls *canctn[0-9]*`   ;  mv $f  CNLC.$f
    f=`ls *acustb[0-9]*`   ;  mv $f  CATB.$f
    f=`ls *accusgtb[0-9]*` ;  mv $f  CATB.$f
    f=`ls *acus[0-9]*`     ;  mv $f  CAUS.$f
    

    也可以尝试:

    f=MyFileName; mv $f {pref1,pref2}$f{suf1,suf2}
    

    这将产生具有前缀和后缀的所有组合:

    pref1.MyFileName.suf1
    ...
    pref2.MyFileName.suf2
    

    解决相同问题的另一种方法是创建映射数组并为每个文件类型添加coresponsdent前缀,如下所示:

    #!/bin/bash
    unset masks
    typeset -A masks
    masks[ip[0-9]]=ip
    masks[iaf_usg[0-9]]=ip_usg
    masks[ipusg[0-9]]=ip_usg
    ...
    for fileMask in ${!masks[*]}; 
    do  
    registryEntry="${masks[$fileMask]}";
    fileName=*${fileMask}*
    [ -e ${fileName} ] &&  mv ${fileName} ${registryEntry}.${fileName}  
    done
    
        7
  •  1
  •   Harkály Gergő    8 年前

    批量重命名文件bash脚本

    #!/bin/bash
    # USAGE: cd FILESDIRECTORY; RENAMERFILEPATH/MultipleFileRenamer.sh FILENAMEPREFIX INITNUMBER
    # USAGE EXAMPLE: cd PHOTOS; /home/Desktop/MultipleFileRenamer.sh 2016_
    # VERSION: 2016.03.05.
    # COPYRIGHT: Harkály Gergő | mangoRDI (https://wwww.mangordi.com/) 
    
    # check isset INITNUMBER argument, if not, set 1 | INITNUMBER is the first number after renaming
    if [ -z "$2" ]
        then i=1;
    else
        i=$2;
    fi
    
    # counts the files to set leading zeros before number | max 1000 files
    count=$(ls -l * | wc -l)
    if [ $count -lt 10 ]
        then zeros=1;
    else
        if [ $count -lt 100 ]
            then zeros=2;
        else
            zeros=3
        fi
    fi
    
    # rename script
    for file in *
    do
        mv $file $1_$(printf %0"$zeros"d.%s ${i%.*} ${file##*.})
        let i="$i+1"
    done
    
        8
  •  1
  •   Brajan Elektro    6 年前

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

    ls | xargs -I fileName mv fileName fileName.suffix