Pergunta

Como eu faço mv original.filename new.original.filename sem ter que redigitar o nome do arquivo original?

Eu imagino ser capaz de fazer algo assim mv -p=new. original.filename ou talvez mv original.filename new.~ ou qualquer outra coisa -. Mas eu não posso ver nada parecido com isso depois de olhar para man mv páginas / info mv

Claro, eu poderia escrever um script shell para fazer isso, mas não há um comando / bandeira existente para ele?

Foi útil?

Solução

Em Bash e zsh você pode fazer isso com Brace Expansão . Isso simplesmente expande a lista de itens no aparelho. Por exemplo:

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

Assim, você pode fazer sua mudança de nome da seguinte forma:

mv {,new.}original.filename

como o que amplia a:

mv original.filename new.original.filename

Outras dicas

Você pode usar a mudança de nome (1) de comando:

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

Editar: Se renomeação não está disponível e você tem que mudar o nome de mais de um arquivo, shell script pode realmente ser curto e simples para isso. Por exemplo, para mudar o nome de todos os .jpg para prefixo _ .jpg no diretório atual:

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

Você pode conseguir um compatível renomeação de arquivo múltipla unix (usando wildcards), criando um loop:

for file in *; do
  mv $file new.${file%%}
done

Eu vi as pessoas mencionam um comando rename, mas não é rotineiramente disponível em sistemas Unix (ao contrário de sistemas Linux, por exemplo, ou Cygwin - em ambos os quais, de mudança de nome é um executável em vez de um script). Essa versão do rename tem uma funcionalidade bastante limitada:

rename from to file ...

Ele substitui o de parte dos nomes de arquivos com o para , e o exemplo dado na página do manual é:

rename foo foo0 foo? foo??

Isso renomeia foo1 para foo01 e foo10 para foo010, etc.

Eu uso um script Perl chamado rename, que originalmente escavado desde a primeira edição Camel livro, circa 1992, e depois estendido, para renomear arquivos.

#!/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";
    }
}

Isso permite que você escreva qualquer substituto Perl ou comando transliterate para mapear nomes de arquivo. No exemplo específico solicitado, você usaria:

rename 's/^/new./' original.filename

A maneira mais fácil de arquivos renomear em massa no diretório é:

ls | xargs -I fileName mv fileName fileName.suffix

Se é aberta a uma modificação, você poderia usar um sufixo em vez de um prefixo. Então você pode usar a guia-conclusão para obter o nome do arquivo original e adicione o sufixo.

Caso contrário, não isso não é algo que é suportado pelo comando mv. Um script shell simples poderia lidar embora.

No meu caso eu tenho um grupo de arquivos que precisa ser renomeado antes que eu possa trabalhar com eles. Cada arquivo tem o seu próprio papel no grupo e tem seu próprio padrão.

Como resultado, eu tenho uma lista de comandos de mudança de nome como este:

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

Tente este também:

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

Isto irá produzir todas as combinações com prefixos e sufixos:

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

Outra maneira de resolver mesmo problema é criar variedade de mapeamento e adicionar corespondent prefixo para cada tipo de arquivo, como mostrado abaixo:

#!/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

arquivos Bulk Rename festança roteiro

#!/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
Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top