Comment puis-je déplacer des fichiers dans un répertoire où il peut y avoir des centaines ou des milliers de fichiers dans le répertoire, et vous ne savez peut-être pas s'il y a des dupes dans ..
. Quelle méthode utiliseriez-vous?
La façon de gérer les dupes variera, parfois nous remplacerons, parfois nous devons être plus sûrs. Les E / S peuvent être importantes car ce sont des serveurs de production. Mais étant donné la quantité, une invite pour les fichiers non dupliqués n'est pas une option. La préservation des autorisations et des horodatages, etc., est importante. Nous ne savons généralement pas quelles sont les données.
Oh et son utilisation mv
n'est pas requise rsync
, les cp
solutions sont les bienvenues.
note: nous exécutons CentOS 5.5, alors faites-moi savoir si cela ne fonctionnera pas car il s'agit d'une fonctionnalité plus récente ...
la source
mv
et si nous nous soucions de la conservation dans le cas de ... et si nous avons déjà fait une sauvegarde. Cette question est assez ouverte. Je cherche juste de bonnes options, et peut-être un commentaire pour savoir si cela peut vous mordre et comment.mv * ../
oumv -i * ../
?Réponses:
Je recommanderais d'utiliser rsync du parent:
qui sauvegardera tous les fichiers en double existants dans le parent vers le fichier -original.
la source
-a
implique-r
-l
pourcp
)-H
ou--hard-links
pour rsync pour conserver les liens durs.--link-dest=DIR
indicateur pour obtenir ce comportement comme:rsync -avP --link-dest=/path/to/src /path/to/src/* /path/to/dest/
qui liera en dur dans dst / tous les fichiers inchangés entre src et src, dans ce cas tous les fichiers. Normalement, vous voyez cet indicateur utilisé lorsque vous souhaitez lier à nouveau des fichiers de sauvegarde sans copier leurs données, par exemple--link-dest=/most/recent/backup
.Cela copiera tout ce qui se trouve dans le répertoire actuel dans le répertoire au-dessus, en conservant toutes les autorisations, en utilisant des liens physiques pour minimiser les E / S si possible, et sur les doublons, il crée un nom de fichier ~
après ça
la source
Dans cet exemple, les fichiers seront déplacés de '/ parent / old-dir' vers '/ parent':
Selon les règles rsync, il remplacera les doublons par des fichiers plus récents
old-dir
.la source
Tu peux essayer
qui écrasera les fichiers de dupe dans ..
Vous pouvez utiliser mv -u '{}' pour ne pas écraser si la dupe dans .. est identique ou plus récente
la source
..
à lamv '{}' +
commande car le + ajoute juste à la fin.-exec mv -t .. -- {} +
. Portably:-exec sh -c 'mv -- "$@"' _ {} +
.mv -i
invite uniquement si la destination existe.yes n | mv -i …
déplace tous les fichiers qui n'existent pas dans le répertoire de destination. Sur FreeBSD et OSX, vous pouvez raccourcir cela enmv -n …
.Notez qu'aucun de ceux-ci ne fusionnera un argument de répertoire avec un répertoire existant du même nom dans le répertoire de destination.
Un problème distinct est de savoir comment agir sur tous les fichiers du répertoire en cours. Il y a deux problèmes: saisir tous les fichiers (
*
omet les fichiers à points) et ne pas exécuter dans une ligne de commande. Sous Linux (ou plus généralement avec GNU find et GNU coreutils):Avec GNU find mais pas GNU coreutils (ou les anciennes coreutils GNU):
Portablement:
Comme d'habitude, zsh facilite les choses. Il n'a pas de limitation de longueur de ligne de commande en interne, donc si vous utilisez son
mv
intégré, vous n'avez pas à vous en soucier. Et vous pouvez lui dire de ne pas ignorer les fichiers dot avec leD
qualificatif glob. Limitation: cela ne fonctionne pas sur les systèmes de fichiers (à partir de zsh 4.3.10).la source
J'ai dit sur notre ML
évidemment ce n'est pas très sûr ... cela écrasera les choses. Cela pourrait avoir des limites que je n'ai jamais rencontrées.
la source
-
. Il n'attrapera pas les fichiers dont le nom commence par.
.Ce qui suit est un modèle python que j'ai utilisé à bon escient dans le passé.
la source