Come posso copiare file con nomi di file duplicati in una directory e conservare entrambi i file facendo rinominare automaticamente i duplicati?


11

Sul sistema operativo Windows, quando si copia un file in una directory che ha già un file con quel nome, viene richiesto se si desidera:

  1. copia il file e sostituisci / sovrascrivi quello esistente
  2. annulla la copia del nuovo file nella directory
  3. copia il file, ma rinominalo (come qualcosa come "nomefile - copia (1)")

Quando lo faccio in Ubuntu, non ho quella terza opzione (che è molte volte un'opzione molto utile). Esiste un modo per poterlo fare in Ubuntu?

Risposte:


17

Purtroppo Nautilus non ha questa opzione.

Opzione 1: un file manager diverso

Potresti provare un altro file manager come Dolphin .

Installa Dolphin(richiede il repository Universe )

Opzione 2: riga di comando

È inoltre possibile utilizzare il programma da riga di comando cp(1)con l'opzione di backup:

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

Ciò ha i seguenti effetti che possono essere controllati con altre opzioni come descritto nella pagina del manuale di cp(1):

--backup[=CONTROL] - eseguire un backup di ciascun file di destinazione esistente

-b- Mi piace --backupma non accetta un argomento

-S, --suffix=SUFFIX- sovrascrive il solito suffisso di backup

Il suffisso di backup è ~, a meno che non sia impostato con --suffixo SIMPLE_BACKUP_SUFFIX. Il metodo di controllo della versione può essere selezionato tramite l' --backupopzione o tramite la VERSION_CONTROLvariabile di ambiente. Ecco i valori:

  • none, off: non eseguire mai backup (anche se --backupviene fornito)
  • numbered, t: effettua backup numerati
  • existing, nil: numerato se esistono backup numerati, semplice altrimenti
  • simple, never: esegui sempre backup semplici

Esempio

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

Ciò copierà tutti i file ~/Musica ~/Videos. Se esiste un file con lo stesso nome nella destinazione, viene rinominato aggiungendo il .origsuo nome come backup. Se esiste un file con lo stesso nome del backup, il backup viene invece rinominato aggiungendo .1e se esiste anche così .2e così via. Solo allora il file di origine viene copiato nella destinazione.

Se si desidera copiare i file nelle sottodirectory utilizzare ricorsivamente:

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

Grazie per il suggerimento di utilizzare un file manager diverso. Sfortunatamente, anche Thunar non ha l'opzione a cui mi riferisco. Ha solo: Annulla, Salta tutto, Salta, Sostituisci, Sostituisci tutto. Proverà Dolphin.
Heisenbergman,

1
Dolphin funziona alla grande per questo :)
Heisenbergman,

Grazie per aver provato i due. Aggiornerò la mia domanda in base alle tue scoperte.
David Foerster,

@heisenbergman, ciao, cosa intendevi con Dolphin funziona alla grande per questo? Offre la possibilità di rinominare, ma mi permette ancora di rinominare i file uno per uno. Sfortunatamente l'opzione "applica a tutti" non può essere utilizzata con l'opzione per rinominare. Questo è abbastanza inutile per una grande quantità di file. Questa è solo la mia versione? Sei riuscito a rinominare tutti i tuoi doppi contemporaneamente (come puoi su Windows), usando Dolphin?
Kvothe,

L'ultima parte sull'aggiunta di ID numero a ciascun file se esiste già non funziona per me :( Copia il primo file file.json, quindi ricevo un file.json.json(usando il --suffix=json) e quindi ricevo un errore dicendo che non è possibile sovrascrivere un file esistente Usando Ubuntu 18, il piping risulta da findquesto:. find ./ -name 'meta.json' | xargs cp --backup=existing --suffix=.json -t ~/data/Ricevo 3 file come descritto sopra, quindi l'errore:. cp: will not overwrite just-created '/home/user/data/meta.json' with './path/to/meta.json'Ho anche provato i -I {}segnaposto con xargs.
n1k31t4

2

Trovato questo su superutente :

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

Il file con lo stesso nome viene rinominato nel file con l'md5sum aggiunto al nome. Se lo salvi in ​​un nome di file come "saveCopy" puoi usarlo in findquesto modo per eseguirlo:

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

Per ulteriori informazioni su questo vedi il link.



0

Copia questo script nella directory principale, rendilo eseguibile ed eseguilo:

#!/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
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.