Copier des fichiers avec renommer

28

J'ai une énorme arborescence de fichiers. Certains fichiers ont le même nom mais dans des cas différents, par exemple, some_code.cet Some_Code.c.

Donc, lorsque j'essaie de le copier sur un système de fichiers NTFS / FAT, il me demande si je veux qu'il remplace le fichier ou l'ignore.

Existe-t-il un moyen de renommer automatiquement ces fichiers, par exemple, en ajoutant  (1)au nom du fichier de conflit (comme le fait Windows 7)?

Alexander Dzyoba
la source
Curieuse. Je voulais juste voir quel genre d'erreur j'obtenais si j'essayais de produire un fichier avec le même nom sur une partition NTFS (HPFS / NTFS, selon sudo fdisk -l /dev/sda), et je l'ai fait touch foo; touch Fooet fini avec 2 fichiers fooet Foo. Mais je ne suis pas curieux de pouvoir redémarrer Windows, pour voir à quoi ils ressemblent là-bas. Migth, c'est juste un problème de FAT? Ah - J'ai une clé USB avec FAT, et je pourrais créer un système FAT dans un fichier, ... - un instant s'il vous plaît. :)
utilisateur inconnu

Réponses:

41

De nombreux outils GNU tels que cp, mvet le tarsoutien en créant des fichiers de sauvegarde lorsque la cible existe. Autrement dit, lors de la copie foovers bar, s'il existe déjà un fichier appelé bar, l' existant bar sera renommé, et après la copie barcontiendra le contenu de foo. Par défaut, barest renommé bar~, mais le comportement peut être modifié:

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

Il existe d'autres variantes, telles que la création de sauvegardes numérotées uniquement lorsqu'une existe déjà. Voir le manuel coreutils pour plus de détails.

Gilles 'SO- arrête d'être méchant'
la source
1
Brillant. Je ne savais pas que cette option existait et elle s'est avérée extrêmement utile. Merci @Gilles.
Steve Hill
2
Le cp OSX n'a ​​pas d'indicateur --backup. utilisez brew install coreutils, puis utilisez la commande à la gcpplace.
Weston Ganger
6

j'ai essayé

apropos copy | grep "(1)" 

pour trouver des candidats possibles, et mcopy s'est présenté.

man mcopy 

montre une option prometteuse -D clash-optionn'est-ce pas cool? Mais pas si cool - ce n'est pas décrit. Mais il y a quelques conseils sur mtools.dvi, que j'ai recherché sur mon système, sans succès, et via google, sans succès, mais ensuite, avec google, j'ai cherché directement mcopy clash-optionet trouvé ce site .

J'ai fait un petit test

mcopy -D A f* a 

aux tests pour autorename et targetdir a- au lieu de renommer automatiquement, il m'a demandé que chaque fichier soit ignoré ou remplacé, ce stupide s ....

Ma version est mtools-4.0.10et la page d'aide date de 1996 - 15 ans. Faut-il vraiment perdre certaines fonctionnalités, en attendant?

Je diviserais le travail en deux étapes:

  • Créez une fonction courte, qui génère un nom unique pour un fichier, si ce nom est occupé.
  • Exécutez findet exécutez ce script pour chaque fichier que vous souhaitez copier.

Allons-nous aider dans cette approche? :)

Voici un script, pour nommer automatiquement les fichiers:

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

et voici mon invocation de test:

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

Remarque: -maxdepth, -name et -type sont utilisés pour restreindre considérablement le nombre de fichiers affectés. Je n'ai pas testé le script pour des structures de fichiers plus profondes, ni pour des blancs dans les noms de fichiers et autres caractères géniaux comme le saut de ligne, le saut de page et ainsi de suite.

J'ai utilisé .1 car il ne pose pas de problème dans la plupart des commandes, tandis que a (et a) ont souvent besoin de masquage.

Utilisateur inconnu
la source
0

Pas avec GNU cp, du moins.

Il est fortement conseillé de ne pas avoir de noms de fichiers en double (en ignorant la casse), ils vous causeront juste un monde de douleur. Rechercher une liste de ces doublons à l'aide de

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

Renommez ensuite manuellement l'un des fichiers de chaque ligne en cas de sortie. Essayez d'éviter de créer des doublons à l'avenir.

jmtd
la source
Le gars n'a jamais laissé entendre que c'est lui qui a créé ce gâchis.
tshepang
Eh bien, oui, c'est vrai, mais c'est lui qui en subit les conséquences ☺
jmtd
J'ai une situation où je me suis retrouvé avec des sauvegardes à des moments légèrement différents. Vous voulez les combiner, mais pas encombrer différentes versions. Par exemple, pour autant que je sache, la plus ancienne pourrait être meilleure. Je ne peux le dire qu'après avoir examiné. En attendant, il faut copier et renommer les sauvegardes.
abalter