J'ai deux arbres de répertoire avec des dispositions similaires, à savoir
.
|-- dir1
| |-- a
| | |-- file1.txt
| | `-- file2.txt
| |-- b
| | `-- file3.txt
| `-- c
| `-- file4.txt
`-- dir2
|-- a
| |-- file5.txt
| `-- file6.txt
|-- b
| |-- file7.txt
| `-- file8.txt
`-- c
|-- file10.txt
`-- file9.txt
Je souhaite fusionner les arborescences de répertoires dir1 et dir2 pour créer:
merged/
|-- a
| |-- file1.txt
| |-- file2.txt
| |-- file5.txt
| `-- file6.txt
|-- b
| |-- file3.txt
| |-- file7.txt
| `-- file8.txt
`-- c
|-- file10.txt
|-- file4.txt
`-- file9.txt
Je sais que je peux le faire en utilisant la commande "cp", mais je souhaite déplacer les fichiers au lieu de les copier, car les répertoires que je souhaite fusionner sont vraiment volumineux et contiennent beaucoup de fichiers (des millions). Si j'utilise "mv", l'erreur "Fichier existe" est générée en raison de noms de répertoire en conflit.
UPDATE: Vous pouvez supposer qu'il n'y a pas de fichiers en double entre les deux arborescences.
Réponses:
Cela créerait des liens durs plutôt que de les déplacer, vous pouvez vérifier qu'ils ont été déplacés correctement, puis supprimer
dir1/
etdir2/
.la source
--link-dest
chemin absolu, ou relatif àmerged/
; ou il va copier.C'est étrange personne n'a noté qui
cp
a l'option-l
:Vous pouvez faire quelque chose comme
la source
cp -l
ne fonctionne pas entre systèmes de fichiers.cp -a
(synonyme decp -RPp
) pour conserver tous les attributs des fichiers et éviter de suivre les liens symboliques: la commande devient icicp -al dir1/* dir2/* merge
.Vous pouvez utiliser renommer (ou prename, du paquet perl) pour cela. Attention, le nom ne fait pas nécessairement référence à la commande que je décris en dehors de debian / ubuntu (bien que ce soit un seul fichier perl portable si vous en avez besoin).
Vous avez également la possibilité d'utiliser vidir (à partir de moreutils) et de modifier les chemins de fichiers à partir de votre éditeur de texte préféré.
la source
Je aime les rsync et PRFNOM solutions, mais si vous voulez vraiment faire mv faire le travail et
-print0
et-depth
,-0
,il est alors possible de gérer un grand nombre de fichiers dont les noms peuvent contenir des espaces aléatoires, le tout avec un script shell de type Bourne:
la source
find . -name '*.torrent' | xargs -d '\n' rm
Force brute
bash
test fait cela
la source
J'ai dû faire cela plusieurs fois pour les arbres de code source à différents stades de développement. Ma solution consistait à utiliser Git de la manière suivante:
Vous pouvez le raffiner avec des branches, etc., mais c’est l’idée générale. Et vous avez moins peur de tout gâcher parce que vous avez un instantané complet de chaque état.
la source