Frage

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

Ich könnte mir vorstellen mv -p=new. original.filename oder was auch immer in der Lage, so etwas wie mv original.filename new.~ zu tun oder vielleicht - aber ich kann nicht so etwas wie dies nach einem Blick auf man mv / info mv Seiten sehe

.

Natürlich, ich könnte einen Shell-Skript schreiben, dies zu tun, ist aber nicht dort ein bestehender Befehl / Flag für das?

War es hilfreich?

Lösung

In Bash und zsh Sie können dies tun, mit Brace Expansion . Dies erweitert einfach eine Liste von Elementen in Klammern. Zum Beispiel:

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

So können Sie Ihre Umbenennungs tun können, wie folgt:

mv {,new.}original.filename

da dies erweitert zu:

mv original.filename new.original.filename

Andere Tipps

könnten Sie verwenden den Umbenennungs (1) Befehl:

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

Edit: Wenn Umbenennungs nicht verfügbar ist, und Sie müssen mehr als eine Datei umbenennen, Shell Scripting wirklich für diese kurz und einfach sein. Zum Beispiel, benennen Sie alle .jpg Präfix _ .jpg im aktuellen Verzeichnis:

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

Sie können eine kompatible Umbenennungs mehrere Datei Unix erreichen (mit Wildcards) durch eine for-Schleife zu erstellen:

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

Ich Leute habe gesehen, einen rename Befehl erwähnen, aber es ist auf Unix-Systemen nicht routinemäßig zur Verfügung (im Gegensatz zu Linux-Systemen im Gegensatz zu sagen oder Cygwin - auf beide, umbenennen ist ein ausführbare anstatt ein Skript). Diese Version von rename hat eine ziemlich eingeschränkte Funktionalität:

rename from to file ...

Es ersetzt die von Teil der Dateinamen mit dem , und das Beispiel in der Manpage gegeben ist:

rename foo foo0 foo? foo??

Dieses umbenennt foo1 foo01 und foo10 zu foo010, etc.

Ich benutze einen Perl-Skript namens rename, die ich ursprünglich aus dem ersten Auflage Camel Buch ausgegraben, circa 1992, und dann erweitert, um Dateien zu umbenennen.

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

Auf diese Weise können Sie jede Perl Ersatz schreiben oder transkribieren Befehlsdateinamen abzubilden. Im konkreten Beispiel aufgefordert, dann würden Sie verwenden:

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

Der einfachste Weg, um Bulk-Dateien im Verzeichnis umbenennen ist:

ls | xargs -I fileName mv fileName fileName.suffix

Wenn es offen für eine Modifikation, könnten Sie ein Suffix anstelle eines Präfix verwenden. Dann könnten Sie Tab-Vervollständigung verwenden die ursprünglichen Dateinamen zu erhalten und das Suffix hinzuzufügen.

Ansonsten nicht das ist nicht etwas, das von dem Befehl mv unterstützt wird. Ein einfacher Shell-Skript könnte allerdings bewältigen.

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

Als Ergebnis habe ich eine Liste von Umbenennungs Befehle 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}

Damit werden alle Kombinationen mit Präfixen und Suffixen erzeugen:

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

Ein andere Möglichkeit, gleiches Problem zu lösen, ist Mapping Array zu erstellen und corespondent Präfix für jeden Dateityp hinzufügen, wie unten dargestellt:

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

Bulk-Dateien umbenennen Bash-Skript

#!/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
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top