Kopieren Sie Dateien mit Umbenennung

28

Ich habe einen riesigen Dateibaum. Einige Dateien haben den gleichen Namen, aber in anderen Fällen, z . B. some_code.cund Some_Code.c.

Wenn ich versuche, es in ein NTFS / FAT-Dateisystem zu kopieren, werde ich gefragt, ob die Datei ersetzt oder übersprungen werden soll.

Gibt es eine Möglichkeit, solche Dateien automatisch umzubenennen, indem beispielsweise  (1)der Name der Konfliktdatei hinzugefügt wird (wie dies bei Windows 7 der Fall ist)?

Alexander Dzyoba
quelle
Neugierig. Ich wollte nur sehen, welche Art von Fehler ich bekomme, wenn ich versuche, eine Datei mit dem gleichen Namen auf einer NTFS-Partition (laut HPFS / NTFS sudo fdisk -l /dev/sda) zu touch foo; touch Fooerstellen , und tat und endete mit 2 Dateien foound Foo. Aber ich bin nicht neugierig darauf, Windows neu zu starten, um zu sehen, wie sie dort aussehen. Ist das nur ein FAT-Problem? Ah - Ich habe einen USB-Stick mit FAT und könnte ein FAT-System in einer Datei erstellen, ... - einen Moment bitte. :)
Benutzer unbekannt

Antworten:

41

Viele GNU - Tools wie cp, mvund tarUnterstützung Erstellung von Backup - Dateien , wenn das Ziel vorhanden ist . Das heißt, wenn beim Kopieren foonach barbereits eine Datei aufgerufen wurde bar, wird die vorhandene bar umbenannt und enthält nach dem Kopieren barden Inhalt von foo. Standardmäßig barwird in umbenannt bar~, das Verhalten kann jedoch geändert werden:

                                # If a file foo exists in the target, then…
cp -r --backup source target    #   rename foo → foo~
cp -r --backup=t source target  #   rename foo → foo.~1~ (or foo.~2~, etc)

Es gibt andere Varianten, z. B. das Erstellen nummerierter Sicherungen nur, wenn bereits eine vorhanden ist. Weitere Informationen finden Sie im coreutils-Handbuch .

Gilles 'SO - hör auf böse zu sein'
quelle
1
Brillant. Ich wusste nicht, dass es diese Option gibt, und sie hat sich nur als äußerst nützlich erwiesen. Vielen Dank an Gilles.
Steve Hill
2
OSX cp hat kein --backup-Flag. Verwenden Sie stattdessen brew install coreutilsund dann den Befehl gcp.
Weston Ganger
6

Ich habe es versucht

apropos copy | grep "(1)" 

mögliche Kandidaten zu finden, und mcopy zeigte sich.

man mcopy 

zeigt eine vielversprechende Option -D clash-optionist das nicht cool? Aber nicht so cool - es wird nicht beschrieben. Es gibt jedoch einige Hinweise zu mtools.dvi, die ich auf meinem System erfolglos und über Google erfolglos durchsucht habe. Mit Google habe ich dann direkt nach dieser Site gesucht mcopy clash-optionund sie gefunden .

Ich habe einen kurzen Test gemacht

mcopy -D A f* a 

zum testen auf autorename und targetdir a- anstelle von autorename wurde ich gebeten, jede datei zu ignorieren oder zu überschreiben, das dumme s ....

Meine Version ist mtools-4.0.10und die Hilfeseite ist von 1996 - 15 Jahre alt. Sollten wir in der Zwischenzeit wirklich einige Features verlieren?

Ich würde die Arbeit in zwei Schritte aufteilen:

  • Machen Sie eine kurze Funktion, die einen eindeutigen Namen für eine Datei generiert, wenn dieser Name belegt ist.
  • Führen Sie finddieses Skript für jede Datei aus, die Sie kopieren möchten.

Sollen wir bei diesem Ansatz behilflich sein? :)

Hier ist ein Skript zum automatischen Benennen von Dateien:

#!/bin/bash

name=$1
target=$2

autorename () {
name=$1
target=$2
no=$3 

test -e ${target}/${name}.$no && autorename ${name} ${target} $((no+1)) || cp ${name} ${target}/${name}.$no 

}

test -e ${target}/${name} && autorename ${name} ${target} 0 || cp ${name} ${target} 

und das ist mein Testaufruf:

find -maxdepth 1 -name "fo*" -type f -exec ./autorename.sh {} /mnt/hidden/test/a ";"

Hinweis: -maxdepth, -name und -type werden verwendet, um die Anzahl der betroffenen Dateien drastisch zu beschränken. Ich habe das Skript weder auf tiefere Dateistrukturen noch auf Leerzeichen in Dateinamen und andere, unkonventionelle Zeichen wie Zeilenvorschub, Seitenvorschub usw. getestet.

Ich habe .1 verwendet, weil es in den meisten Befehlen keine Probleme macht, während a (und a) oft maskiert werden müssen.

Benutzer unbekannt
quelle
0

cpZumindest nicht mit GNU .

Es wird dringend empfohlen, keine doppelten Dateinamen zu verwenden (Groß- und Kleinschreibung wird ignoriert). Suchen Sie eine Liste solcher Duplikate mit

find . | tr A-Z a-z | sort | uniq -d

Benennen Sie dann bei der Ausgabe eine der Dateien für jede Zeile manuell um. Vermeiden Sie in Zukunft das Erstellen von Duplikaten.

jmtd
quelle
Der Typ hat nie angedeutet, dass er derjenige ist, der dieses Chaos verursacht hat.
Tshepang
Na ja, stimmt, aber er ist derjenige, der unter den Konsequenzen leidet ☺
jmtd
Ich habe eine Situation, in der ich Backups aus etwas anderen Zeiten erstellt habe. Möchten Sie sie kombinieren, aber nicht verschiedene Versionen verprügeln. Zum Beispiel könnte, soweit ich weiß, der ältere besser sein. Kann ich erst nach Prüfung feststellen. In der Zwischenzeit müssen Sie Backups kopieren und umbenennen.
Abalter