Comment cloner / copier tous les attributs de fichier / répertoire dans un fichier / répertoire différent?


15

Je veux copier les attributs (propriété, groupe, ACL, attributs étendus, etc.) d'un répertoire dans un autre mais pas le contenu du répertoire lui-même.

Cela ne fonctionne pas:

cp -v --attributes-only A B
cp: omitting directory `A'           

Remarque: ce n'est pas obligatoire cp.


1
Vous n'avez pas réussi -r, donc il ignore les répertoires. Mais je suppose que vous voulez copier uniquement les attributs, pas le contenu? Je ne peux penser qu'à des vilains hacks. Notez également que installpeut préserver les contextes SELinux.
lynxlynxlynx


1
@Gilles, merci d'avoir pointé un autre sujet. Il résout une partie du problème: propriété et mode. Qu'en est-il des attributs étendus?
Grzegorz Wierzowiecki

1
@GrzegorzWierzowiecki Je crains que très peu d'outils prennent en charge les attributs étendus. S'ils sont importants, utilisez la suggestion rsync de killermist.
Gilles 'SO- arrête d'être méchant'

Btw. Voici de bons exemples où l'on peut voir des xattrs en action: GUI de Dolphin dans KDE: imgur.com/oguuJNm ou URL d'où le fichier a été téléchargé défini par les navigateurs: références: gist.github.com/gwpl/a00e18bc150f1e3518335d13c5e46ad7 + freedesktop.org/ wiki / CommonExtendedAttributes + vhanda.in/blog/2014/07/tagging-your-files
Grzegorz Wierzowiecki

Réponses:


13

Après pas mal de tâtonnements sur la ligne de commande, je pense avoir trouvé la réponse. Mais ce n'est pas une cpréponse liée.

rsync -ptgo -A -X -d --no-recursive --exclude=* first-dir/ second-dir

Cela fait:

-p, --perms                 preserve permissions
-t, --times                 preserve modification times
-o, --owner                 preserve owner (super-user only)
-g, --group                 preserve group
-d, --dirs                  transfer directories without recursing
-A, --acls                  preserve ACLs (implies --perms)
-X, --xattrs                preserve extended attributes
    --no-recursive          disables recursion

Pour référence

    --no-OPTION             turn off an implied OPTION (e.g. --no-D)
-r, --recursive             recurse into directories

Ce dernier montage est définitivement un succès là-bas. Avec ou sans un / sur le second dir, ça fait finalement exactement ce qui est demandé, ça ressemble.
killermist

La barre oblique de fin ne fait la différence que sur le premier argument, pas sur le second. C'est expliqué dans le 3e ou le 4e paragraphe de la USAGEsection de la rsync(1)page de manuel.
jw013

@ jw013 Après avoir lu la documentation rsync à plusieurs reprises, il y a des mois, ma conclusion était que les barres obliques de fin étaient implicites "dans", que ce soit dans le premier (deuxième, troisième, etc.) ou dernier argument. Mais là encore, je termine souvent mes commandes par un / sur le dernier argument pour impliquer / exiger un affect "into".
killermist

Mon intuition de copier tous les attributs de répertoire et aucun fichier normal ne le serait rsync -a -AX --include='*/' --exclude='*'. Je n'ai pas testé.
Gilles 'SO- arrête d'être méchant'

@ jw013 Merci d'avoir aidé à obtenir cette réponse. J'ai essayé TELLEMENT d'options sur mon petit environnement de test de bac à sable et j'ai continué à m'en approcher, mais certaines parties ne fonctionnaient pas correctement.
killermist

0
chmod --reference=first-dir second-dir

2
Cela ne fonctionnera pas récursivement, et je pense que cela ne copiera pas les ACL ou les attributs étendus.
Mat

1
Ce n'est pas censé être récursif: l'OP a demandé «pas le contenu du répertoire lui-même», et la réponse acceptée indique à rsync --no-recursive. Le problème avec cette réponse est qu'elle ne fait ni ACL ni XATTR.
ShadSterling

0
cp -rfp from_dir to_dir
  • -r - récursif
  • -f - Obliger
  • -p - préserver les attributs: mode, propriété, horodatages

Besoin également --attributs uniquement
smremde

0

Je ne comprends pas car cela semble fonctionner pour les autres, mais la méthode rsync échoue pour moi sur FreeBSD avec ZFS. Rien ne se passe. Mais la méthode de Jean-François Dockes fonctionne. (voir: https://www.lesbonscomptes.com/pxattr/ ) Répertoire source = A & répertoire de destination = B, à partir de la question d'origine.

pxattr -lR A > tmp.EAs

(éditez la première ligne de tmp.EAs pour changer le répertoire A en B, s / A / B /)

pxattr -S tmp.EAs

Donc, vous ne recommandez pas seulement la méthode de quelqu'un d'autre ; vous recommandez le programme de quelqu'un d'autre , non? C'est OK, mais je viens de perdre cinq minutes à chercher de la documentation sur un programme non standard peu connu. Ce serait bien si vous déclariez plus clairement que vous recommandez que les gens téléchargent un programme non standard peu connu.
G-Man dit `` Réintègre Monica ''

haussement d'épaules C'est dans l'arbre des ports. Cela ne le rend pas exactement non standard. Ce n'est pas aussi obscur pyxattret j'ai essayé ça aussi. C'était une sorte d'écrou difficile à casser. Soi-disant gnu cp fonctionne pour cela, mais je ne peux pas y aller. Les attributs étendus méritent mieux que cela. De plus, pxattr fonctionne au moins sous linux, osx et bsd.
cira

0
rsync -aAX --exclude='*' src_dir/ dst_dir

où dst_dir - est un répertoire cible. Ou:

rsync -dADXgot src_dir dst_dir

où dst_dir - est un répertoire contenant le répertoire cible ou un répertoire cible inexistant.

Depuis la page de manuel de rsync:

    -a, --archive               archive mode; equals -rlptgoD (no -H,-A,-X)
        --exclude=PATTERN       exclude files matching PATTERN

    -d, --dirs                  transfer directories without recursing
    -p, --perms                 preserve permissions
    -A, --acls                  preserve ACLs (implies -p)
    -X, --xattrs                preserve extended attributes
    -o, --owner                 preserve owner (super-user only)
    -g, --group                 preserve group
        --devices               preserve device files (super-user only)
        --specials              preserve special files
    -D                          same as --devices --specials
    -t, --times                 preserve modification times

-3

Vous avez besoin du "-r" pour copier un répertoire.


2
Je pense que je vous ai mal compris, vous n'avez pas besoin du contenu, juste du xattr. S'il s'agissait de SELinux, vous pourriez utiliser chcon référençant le répertoire d'origine (A).
triple le

-rimplique la copie de tous les sous-répertoires et fichiers qu'ils contiennent ... Je ne veux pas copier l'arborescence entière ... Je veux copier les attributs pour un seul et un seul répertoire - sans affecter son contenu.
Grzegorz Wierzowiecki
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.