Copia i file con rinomina


28

Ho un enorme albero di file. Alcuni file hanno lo stesso nome ma in casi diversi, ad esempio, some_code.ce Some_Code.c.

Quindi, quando sto provando a copiarlo in un filesystem NTFS / FAT, mi chiede se voglio che sostituisca il file o lo salti.

Esiste un modo per rinominare automaticamente tali file, ad esempio aggiungendo  (1)al nome del file di conflitto (come fa Windows 7)?


Curioso. Volevo solo vedere che tipo di errore ottengo se provo a produrre un file con lo stesso nome su una partizione NTFS (HPFS / NTFS, secondo sudo fdisk -l /dev/sda), e ho fatto touch foo; touch Fooe finito con 2 file fooe Foo. Ma non sono curioso di riavviare Windows, per guardare come sembrano laggiù. Migth è solo un problema FAT? Ah - Ho una chiavetta USB con FAT e potrei creare un sistema FAT all'interno di un file, ... - Un momento per favore. :)
utente sconosciuto

Risposte:


41

Molti strumenti GNU, come cp, mve tarsupporta la creazione di file di backup quando esiste il bersaglio. Cioè, quando si copia foosu bar, se esiste già un file chiamato bar, l' esistente bar verrà rinominato e dopo che la copia barconterrà il contenuto di foo. Per impostazione predefinita, barviene rinominato in bar~, ma il comportamento può essere modificato:

                                # 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)

Esistono altre varianti, come la creazione di backup numerati solo quando ne esiste già una. Consulta il manuale di coreutils per maggiori dettagli.


1
Brillante. Non sapevo che questa opzione esistesse e si è rivelata estremamente utile. Grazie @Gilles.
Steve Hill,

2
OSX cp non ha il flag --backup. utilizzare brew install coreutilse quindi utilizzare il comando gcpinvece.
Weston Ganger,

6

Provai

apropos copy | grep "(1)" 

per trovare possibili candidati e si presentò la copia.

man mcopy 

mostra un'opzione promettente -D clash-optionnon è così bello? Ma non è così bello - non è descritto. Ma ci sono alcuni suggerimenti per mtools.dvi, che ho cercato sul mio sistema, senza successo e tramite google, senza successo, ma poi, con google, ho cercato direttamente mcopy clash-optione trovato questo sito .

Ho fatto un breve test

mcopy -D A f* a 

per i test per autorename e targetdir a- invece di autorenaming mi ha chiesto ogni file da ignorare o sovrascrivere, quello stupido s ....

La mia versione è mtools-4.0.10e la pagina di aiuto è del 1996 - 15 anni. Nel frattempo dovremmo davvero perdere alcune funzionalità?

Dividerei il lavoro in due passaggi:

  • Crea una funzione breve, che genera un nome univoco per un file, se quel nome è occupato.
  • Esegui finded esegui quello script per ogni file che desideri copiare.

Assisteremo in questo approccio? :)

Ecco uno script, per autorename file:

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

e questa è la mia invocazione di prova:

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

Nota: -maxdepth, -name e -type sono stati usati per limitare drasticamente il numero di file interessati. Non ho testato la sceneggiatura per strutture di file più profonde, né per spazi vuoti nei nomi di file e altri personaggi funky come linefeed, pagefeed e così via.

Ho usato .1 perché non crea problemi nella maggior parte dei comandi, mentre a (e a) hanno spesso bisogno di essere mascherati.



0

Almeno con GNU cp.

Si consiglia vivamente di non avere nomi di file duplicati (ignorando il caso), ti causeranno solo un mondo di dolore. Trova un elenco di tali duplicati utilizzando

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

Quindi rinominare manualmente uno dei file per ogni riga se l'output. Cerca di evitare la creazione di duplicati in futuro.


Il ragazzo non ha mai insinuato di essere lui a creare quel casino.
Tshepang,

Bene, sì, è vero, ma è lui a soffrirne le conseguenze ☺
jmtd,

Ho una situazione in cui ho finito con i backup da tempi leggermente diversi. Vuoi combinarli, ma non intasare versioni diverse. Ad esempio, per quanto ne so, quello più vecchio potrebbe essere migliore. Posso dirlo solo dopo aver esaminato. Nel frattempo, è necessario copiare e rinominare i backup.
abalter
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.