Je veux créer une "copie" d'une arborescence de répertoires dans laquelle chaque fichier est un lien physique vers le fichier d'origine
Exemple: j'ai une structure de répertoire:
dirA/
dirA/file1
dirA/x/
dirA/x/file2
dirA/y/
dirA/y/file3
Voici le résultat attendu, une "copie" de l'arborescence où chaque fichier est un lien physique vers le fichier d'origine:
dirB/ # normal directory
dirB/file1 # hardlink to dirA/file1
dirB/x/ # normal directory
dirB/x/file2 # hardlink to dirA/x/file2
dirB/y/ # normal directory
dirB/y/file3 # hardlink to dirA/y/file3
pax
sur FreeBSD, lescp -a
liens symboliques ne sont pas en liens durs.POSIXly, vous utiliseriez
pax
en mode lecture + écriture avec l’-l
option:(
-pe
Conserve tous les attributs possibles des fichiers (dans ce cas seulement les répertoires) qui sont copiés, comme GNUcp
de-a
fait).Maintenant, bien que standard , cette commande n'est pas nécessairement très portable .
Premièrement, de nombreux systèmes basés sur GNU / Linux n'incluent pas
pax
par défaut (même s'il s'agit d'un utilitaire POSIX non facultatif).Ensuite, un certain nombre de bugs et de non-conformités avec quelques implémentations causent un certain nombre de problèmes avec ce code.
pax
(au moins) ne fonctionne pas-rwl
en combinaison avec-s
. Pour une raison quelconque, il semble qu'il applique la substitution à la fois au chemin d'origine et au chemin copié. Donc ci-dessus, il essaierait d'en fairelink("dirB/file", "dirB/file")
au lieu delink("dirA/file", "dirB/file")
.pax
ne crée pas de liens physiques pour les fichiers de type symlink (comportement autorisé par POSIX). De plus, il applique également la substitution aux cibles des liens symboliques (comportement non autorisé par POSIX). Ainsi, par exemple, s'il y a unfoo -> AA
lien symbolique dansdirA
, il deviendrafoo -> BA
dansdirB
.De plus, si vous voulez faire la même chose, mais avec des chemins de fichiers arbitraires dont le contenu est stocké dans
$src
et$dst
, il est important de réaliser quepax -rwl -- "$src" "$dst"
crée la structure de répertoires complète de$src
inside$dst
(qui doit exister et être un répertoire). Par exemple, si$src
estfoo/bar
, alors,$dst/foo/bar
est créé.Si au lieu de cela, vous voulez
$dst
être une copie de$src
, le plus simple est probablement de le faire comme:(ce qui contournerait également la plupart des problèmes mentionnés ci-dessus mais échouerait si le chemin absolu de
$dst
fins se termine par des caractères de nouvelle ligne).Maintenant, cela ne va pas aider sur les systèmes GNU / Linux où il n'y a pas
pax
.Il est intéressant de noter que
pax
POSIX a été créé pour fusionner les fonctionnalités des commandestar
etcpio
.cpio
est une commande Unix historique (à partir de 1977) par opposition à une invention POSIX, et il existe également une implémentation GNU (pas unepax
). Ainsi, même s’il ne s’agit plus d’une commande standard (c’est le cas dans SUSv2), elle reste très courante et comporte un ensemble de fonctionnalités de base sur lesquelles vous pouvez généralement compter.L'équivalent de
pax -rwl
seraitcpio -pl
. Pourtant:cpio
prend la liste du fichier d'entrée sur stdin par opposition aux arguments (délimité par une nouvelle ligne, ce qui signifie que les noms de fichier avec des caractères de nouvelle ligne ne sont pas pris en charge)find
(find
etcpio
ont été développés conjointement par les mêmes personnes)).cpio
implémentations ont des options pour en conserver, mais rien n’est portable).Donc avec
cpio
:la source
-s /A/B
remplaceA
parB
ce quidirA
devientdirB
. Si votre nom de répertoire source n'a pasA
, cela le copiera (lien) sur lui-même. Voir aussi le reste de la réponse pour éventuellement de meilleures approches.Réponse courte:
la source
Si vous recherchez cette fonctionnalité de copie avec liens durs pour effectuer des instantanés ou des sauvegardes de (tout ou partie de) vos fichiers, consultez-les
rsnapshot
.la source
La réponse de @ gudmundur-orn est correcte, mais si vous êtes sur BtrFS sous Linux
cp a --reflink=auto dirA dirB
, faites l'affaire, à la différence que les fichiers sont en réalité différents et que leur modification ne change pas l'autre. Vous pouvez obtenir le même résultatcp -c
sur un Mac avec APFS (auto
une copie complète-c
sera impossible si elle échoue).Tous les systèmes de fichiers COW devraient pouvoir le faire, mais les fournisseurs ne se sont pas mis d’accord sur une option de ligne de commande standard.
la source