Wie kopiere ich alle Datei- / Verzeichnisattribute in eine andere Datei / ein anderes Verzeichnis?


14

Ich möchte die Attribute (Eigentümer, Gruppe, Zugriffssteuerungsliste, erweiterte Attribute usw.) eines Verzeichnisses in ein anderes kopieren, aber nicht den Verzeichnisinhalt selbst.

Das funktioniert nicht:

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

Hinweis: Es muss nicht sein cp.


1
Sie haben nicht bestanden -r, daher werden Verzeichnisse ignoriert. Aber ich denke, Sie möchten nur die Attribute kopieren, nicht den Inhalt? Mir fallen nur hässliche Hacks ein. Beachten Sie auch, dass installSELinux-Kontexte erhalten bleiben können.
Lynxlynxlynx


1
@ Gilles, vielen Dank für den Hinweis auf ein anderes Thema. Es löst einen Teil des Problems: Eigentum und Modus. Was ist mit erweiterten Attributen?
Grzegorz Wierzowiecki

1
@GrzegorzWierzowiecki Ich fürchte, nur wenige Tools unterstützen erweiterte Attribute. Wenn sie wichtig sind, verwenden Sie den Rsync-Vorschlag von Killermist.
Gilles 'SO- hör auf böse zu sein'

Btw. Hier sind schöne Beispiele , wo man xattrs in Aktion sehen kann: GUI von Dolphin in KDE: imgur.com/oguuJNm oder URL aus der Datei heruntergeladen wurde Set von Browser: Referenzen: gist.github.com/gwpl/a00e18bc150f1e3518335d13c5e46ad7 + freedesktop.org/ wiki / CommonExtendedAttributes + vhanda.in/blog/2014/07/tagging-your-files
Grzegorz Wierzowiecki

Antworten:


13

Nach einigem Ausprobieren in der Kommandozeile, glaube ich, habe ich die Antwort gefunden. Aber es ist keine cpverwandte Antwort.

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

Das macht:

-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

Als Referenz

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

Diese letzte Bearbeitung ist definitiv ein Hit. Mit oder ohne ein / auf dem zweiten Verzeichnis, das endlich genau das macht, was gefragt wird, sieht es aus.
Killermist

Der abschließende Schrägstrich unterscheidet nur das erste Argument, nicht das zweite. Es wird im 3. oder 4. Absatz des USAGEAbschnitts der rsync(1)Manpage erklärt.
JW013

@ jw013 Nachdem ich die rsync-Dokumentation vor Monaten wiederholt gelesen hatte, kam ich zu dem Schluss, dass die abschließenden Schrägstriche ein implizites "In" sind, sei es im ersten (zweiten, dritten usw.) oder im letzten Argument. Andererseits beende ich meine Befehle oft mit einem / am letzten Argument, um einen "In" -Effekt zu implizieren / zu fordern.
Killermist

Mein Bauchgefühl, alle Verzeichnisattribute und keine reguläre Datei zu kopieren, wäre rsync -a -AX --include='*/' --exclude='*'. Ich habe nicht getestet.
Gilles 'SO- hör auf böse zu sein'

@ jw013 Vielen Dank, dass Sie geholfen haben, diese Antwort einzuwählen. Ich habe in meiner kleinen Sandbox-Testumgebung so viele Optionen ausprobiert und bin immer näher gekommen, aber ein Teil davon hat nicht richtig funktioniert.
Killermist

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

2
Dies funktioniert nicht rekursiv und ich glaube, es werden keine ACLs oder erweiterten Attribute kopiert.
Mat

1
Es sollte nicht rekursiv sein: Das OP fragte nach "nicht dem Verzeichnisinhalt selbst", und die akzeptierte Antwort teilt rsync mit --no-recursive. Das Problem bei dieser Antwort ist, dass ACLs oder XATTRs nicht ausgeführt werden.
ShadSterling

0
cp -rfp from_dir to_dir
  • -r - rekursiv
  • -f - Macht
  • -p - Attribute erhalten: Modus, Besitz, Zeitstempel

Ich brauche auch --attributes-only
smremde

0

Ich verstehe nicht, weil es für andere zu funktionieren scheint, aber die rsync-Methode schlägt für mich unter FreeBSD mit ZFS fehl. Nichts passiert. Die Methode von Jean-François Dockes funktioniert jedoch. (Siehe: https://www.lesbonscomptes.com/pxattr/ ) Quellverzeichnis = A & Zielverzeichnis = B, aus der ursprünglichen Frage.

pxattr -lR A > tmp.EAs

(Bearbeiten Sie die erste Zeile von tmp.EAs, um das Verzeichnis A in B, s / A / B / zu ändern.)

pxattr -S tmp.EAs

Sie empfehlen also nicht nur die Methode eines anderen . Sie empfehlen das Programm eines anderen , oder? Das ist in Ordnung, aber ich habe nur fünf Minuten damit verbracht, nach Dokumentation für ein wenig bekanntes Nicht-Standard-Programm zu suchen. Es wäre schön, wenn Sie klarer ausdrücken würden, dass Sie den Leuten empfehlen, ein wenig bekanntes, nicht standardisiertes Programm herunterzuladen.
G-Man sagt, dass Monica

Achselzucken Es ist im Hafenbaum. Das macht es nicht gerade nicht zum Standard. Es ist nicht so dunkel wie pyxattrund ich habe es auch versucht. Dies war eine Art harte Nuss zu knacken. Angeblich funktioniert gnu cp dafür, aber ich kann es nicht schaffen. Erweiterte Attribute verdienen es besser. Außerdem funktioniert pxattr zumindest unter Linux, OSX und BSD.
cira

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

Dabei ist dst_dir ein Zielverzeichnis. Oder:

rsync -dADXgot src_dir dst_dir

Dabei ist dst_dir - ein Verzeichnis, das das Zielverzeichnis enthält, oder ein nicht vorhandenes Zielverzeichnis.

Aus der rsync-Manpage:

    -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

Sie benötigen das "-r" zum Kopieren eines Verzeichnisses.


2
Ich glaube, ich habe dich missverstanden, du brauchst nicht den Inhalt, nur das Xattr. Wenn es sich um SELinux handelte, könnten Sie chcon verwenden, das auf das ursprüngliche Verzeichnis verweist (A).
verdreifacht

-rimpliziert das Kopieren aller Unterverzeichnisse und Dateien in ihnen ... Ich möchte nicht den gesamten Baum kopieren ... Ich möchte Attribute für nur ein und nur ein Verzeichnis kopieren - ohne den Inhalt zu beeinflussen.
Grzegorz Wierzowiecki
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.