Wie kann ich Dateien mit doppelten Dateinamen in ein Verzeichnis kopieren und beide Dateien beibehalten, indem die doppelten Dateien automatisch umbenannt werden?

11

Wenn Sie unter Windows eine Datei in ein Verzeichnis kopieren, das bereits eine Datei mit diesem Namen enthält, werden Sie gefragt, ob Sie:

  1. Kopieren Sie die Datei und ersetzen / überschreiben Sie die vorhandene
  2. Brechen Sie das Kopieren der neuen Datei in das Verzeichnis ab
  3. Kopieren Sie die Datei, aber benennen Sie sie um (als "Dateiname - Kopie (1)")

Wenn ich dies in Ubuntu mache, habe ich diese dritte Option nicht (was oft eine sehr nützliche Option ist). Gibt es eine Möglichkeit, dies in Ubuntu zu tun?

heisenbergman
quelle

Antworten:

17

Leider hat Nautilus diese Option nicht.

Option 1: Ein anderer Dateimanager

Sie könnten einen anderen Dateimanager wie Dolphin ausprobieren .

Installieren Sie Dolphin(erfordert das Universum- Repository)

Option 2: Befehlszeile

Sie können das Befehlszeilenprogramm auch cp(1)mit der Sicherungsoption verwenden:

cp --backup -t DESTINATION SOURCE [SOURCE...]

Dies hat die folgenden Effekte, die mit anderen Optionen gesteuert werden können, wie auf der Handbuchseite von beschrieben cp(1):

--backup[=CONTROL] - Erstellen Sie eine Sicherungskopie jeder vorhandenen Zieldatei

-b- wie --backup, akzeptiert aber kein Argument

-S, --suffix=SUFFIX- überschreiben Sie das übliche Backup-Suffix

Das Sicherungssuffix lautet ~, sofern nicht mit --suffixoder festgelegt SIMPLE_BACKUP_SUFFIX. Die Versionskontrollmethode kann über die --backupOption oder über die VERSION_CONTROLUmgebungsvariable ausgewählt werden. Hier sind die Werte:

  • none, off: Niemals Backups erstellen (auch wenn dies --backupangegeben ist)
  • numbered, t: nummerierte Backups erstellen
  • existing, nil: nummeriert, wenn nummerierte Sicherungen vorhanden sind, ansonsten einfach
  • simple, never: Immer einfache Backups erstellen

Beispiel

cp --backup=existing --suffix=.orig -t ~/Videos ~/Music/*

Dies wird kopieren Sie alle Dateien in ~/Musiczu ~/Videos. Wenn am Zielort eine gleichnamige Datei vorhanden ist, wird sie umbenannt, indem sie .origals Sicherung an ihren Namen angehängt wird. Wenn eine Datei mit demselben Namen wie die Sicherung vorhanden ist, wird die Sicherung stattdessen durch Anhängen umbenannt, .1und wenn diese ebenfalls vorhanden ist, .2und so weiter. Erst dann wird die Quelldatei in das Ziel kopiert.

Wenn Sie Dateien in Unterverzeichnissen rekursiv kopieren möchten, verwenden Sie:

cp -R --backup=existing --suffix=.orig -t ~/Videos ~/Music
David Foerster
quelle
Vielen Dank für den Vorschlag, einen anderen Dateimanager zu verwenden. Leider hat Thunar auch nicht die Option, auf die ich mich beziehe. Es hat nur: Abbrechen, Alle überspringen, Überspringen, Ersetzen, Alle ersetzen. Werde Dolphin ausprobieren.
Heisenbergman
1
Dolphin funktioniert großartig dafür :)
Heisenbergman
Danke, dass du die beiden ausprobiert hast. Ich werde meine Frage entsprechend Ihren Erkenntnissen aktualisieren.
David Foerster
@heisenbergman, Hallo, was hast du mit Dolphin gemeint? Es bietet zwar die Möglichkeit zum Umbenennen, aber ich kann die Dateien immer noch nur einzeln umbenennen. Leider kann die Option "Auf alle anwenden" nicht mit der Option zum Umbenennen verwendet werden. Dies ist für eine große Anzahl von Dateien ziemlich nutzlos. Ist das nur meine Version? Haben Sie es geschafft, alle Ihre Doubles auf einmal (wie in Windows) mit Dolphin umzubenennen?
Kvothe
2

Fand dies auf Superuser :

#!/bin/bash
cp -vn "$1" "$2"/ || cp -vn "$1" "$2"/"${1##*/}"~"$(md5sum "$1" | cut -f1 -d' ')"

Die Datei mit demselben Namen wird in die Datei umbenannt, wobei dem Namen md5sum hinzugefügt wird. Wenn Sie es unter einem Dateinamen wie "saveCopy" speichern, können Sie findes folgendermaßen ausführen:

find . -name 'z*.jpg' -exec ./saveCopy {} /tmp/Extracted/ \;

Mehr dazu unter dem Link.

Rinzwind
quelle
0

Kopieren Sie dieses Skript in das oberste Verzeichnis, machen Sie es ausführbar und führen Sie es aus:

#!/bin/bash

## Get a list of all files
list=$(find . -mindepth 2 -type f -print)
nr=1

## Move all files that are unique
find . -mindepth 2 -type f -print0 | while IFS= read -r -d '' file; do
    mv -n $file ./
done
list=$(find . -mindepth 2 -type f -print)

## Checking which files need to be renamed
while [[ $list != '' ]] ; do
   ##Remaming the un-moved files to unique names and move the renamed files
   find . -mindepth 2 -type f -print0 | while IFS= read -r -d '' file; do
       current_file=$(basename $file)
       mv -n $file "./${nr}${current_file}"
   done
   ## Incrementing counter to prefix to file name
   nr=$((nr+1))
   list=$(find . -mindepth 2 -type f -print)
done
Warhansen
quelle