it-swarm.com.de

Wie benenne ich mit Präfix / Suffix um?

Wie mache ich mv original.filename new.original.filename ohne den ursprünglichen Dateinamen erneut einzugeben?

Ich würde mir vorstellen, in der Lage zu sein, so etwas wie mv -p=new. original.filename oder vielleicht mv original.filename new.~ oder was auch immer - aber ich kann so etwas nicht sehen, nachdem ich man mv/info mv Seiten.

Natürlich könnte ich dazu ein Shell-Skript schreiben, aber gibt es keinen Befehl/Flag dafür?

85
Peter Boughton

In Bash und zsh können Sie dies mit Klammererweiterung tun. Dies erweitert einfach eine Liste von Elementen in geschweiften Klammern. Beispielsweise:

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

So können Sie Ihre Umbenennung wie folgt vornehmen:

mv {,new.}original.filename

da dies erweitert:

mv original.filename new.original.filename
113
Dave Webb

Sie können den Befehl rename (1) verwenden:

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

Edit: Wenn das Umbenennen nicht möglich ist und Sie mehr als eine Datei umbenennen müssen, kann Shell-Scripting wirklich kurz und einfach sein. Um beispielsweise alle .jpg in das Präfix _ .jpg im aktuellen Verzeichnis umzubenennen:

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

Sie können eine unix-kompatible Umbenennung mehrerer Dateien (mithilfe von Platzhaltern) erreichen, indem Sie eine for-Schleife erstellen:

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

Ich habe gesehen, dass Leute einen rename -Befehl erwähnt haben, aber er ist auf Unix-Systemen nicht routinemäßig verfügbar (im Gegensatz zu Linux-Systemen wie Cygwin - bei beiden ist das Umbenennen eine ausführbare Datei und kein Skript). . Diese Version von rename hat eine ziemlich eingeschränkte Funktionalität:

rename from to file ...

Es ersetzt den Teil von der Dateinamen durch bis. Das Beispiel in der Manpage lautet:

rename foo foo0 foo? foo??

Dadurch werden foo1 in foo01 und foo10 in foo010 usw. umbenannt.

Ich verwende ein Perl-Skript mit dem Namen rename, das ich ursprünglich aus der ersten Ausgabe des Camel-Buches von 1992 ausgegraben und dann erweitert habe, um Dateien umzubenennen.

#!/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 ([email protected]) {
    @ARGV = <STDIN>;
    chop(@ARGV);
}

for (@ARGV)
{
    if (-e $_ || -l $_)
    {
        my($was) = $_;
        eval $op;
        die [email protected] if [email protected];
        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";
    }
}

Auf diese Weise können Sie einen beliebigen Perl-Ersatz- oder Transliterationsbefehl schreiben, um Dateinamen zuzuordnen. In dem bestimmten angeforderten Beispiel würden Sie Folgendes verwenden:

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

Der einfachste Weg, Dateien im Verzeichnis massenweise umzubenennen, ist:

ls | xargs -I fileName mv fileName fileName.suffix
3
Brajan Elektro

Wenn eine Änderung möglich ist, können Sie anstelle eines Präfixes ein Suffix verwenden. Dann können Sie die Tabulator-Vervollständigung verwenden, um den ursprünglichen Dateinamen abzurufen und das Suffix hinzuzufügen.

Andernfalls wird dies vom Befehl mv nicht unterstützt. Ein einfaches Shell-Skript könnte dies jedoch bewältigen.

2
workmad3

Bash-Skript zur Massenumbenennung von Dateien

#!/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
1
Harkály Gergő

In meinem Fall habe ich eine Gruppe von Dateien, die umbenannt werden müssen, bevor ich mit ihnen arbeiten kann. Jede Datei hat eine eigene Rolle in der Gruppe und ein eigenes Muster.

Als Ergebnis habe ich eine Liste von Umbenennungsbefehlen wie folgt:

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

Versuchen Sie dies auch:

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

Dies erzeugt alle Kombinationen mit Präfixen und Suffixen:

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

Eine andere Möglichkeit, dasselbe Problem zu lösen, besteht darin, ein Zuordnungsarray zu erstellen und für jeden Dateityp ein entsprechendes Präfix hinzuzufügen, wie unten gezeigt:

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