Come clonare / copiare tutti gli attributi di file / directory su file / directory diversi?


15

Voglio copiare gli attributi (proprietà, gruppo, ACL, attributi estesi, ecc.) Di una directory in un'altra, ma non il contenuto della directory stessa.

Questo non funziona:

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

Nota: non deve essere cp.


1
Non hai superato -r, quindi ignora le directory. Ma suppongo che tu voglia copiare solo gli attributi, non i contenuti? Mi vengono in mente solo brutti hack. Si noti inoltre che installpuò preservare i contesti SELinux.
lynxlynxlynx,


1
@Gilles, grazie per aver indicato un altro argomento. Risolve parte del problema: proprietà e modalità. Che dire degli attributi estesi?
Grzegorz Wierzowiecki,

1
@GrzegorzWierzowiecki Temo che pochissimi strumenti supportino attributi estesi. Se sono importanti, usa il suggerimento rsync di killermist.
Gilles 'SO- smetti di essere malvagio' il

Btw. Ecco alcuni esempi in cui è possibile vedere xattrs in azione: GUI di Dolphin in KDE: imgur.com/oguuJNm o URL da cui è stato scaricato il file impostato dai browser: riferimenti: gist.github.com/gwpl/a00e18bc150f1e3518335d13c5e46ad7 + freedesktop.org/ wiki / CommonExtendedAttributes + vhanda.in/blog/2014/07/tagging-your-files
Grzegorz Wierzowiecki

Risposte:


13

Dopo un bel po 'di tentativi ed errori sulla riga di comando, penso di aver trovato la risposta. Ma non è una cprisposta correlata.

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

Questo fa:

-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

Per riferimento

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

L'ultima modifica è sicuramente un successo lì. Con o senza un / sulla seconda directory, che alla fine fa esattamente quello che viene chiesto, sembra.
assassino

La barra finale fa solo la differenza sul primo argomento, non sul secondo. È spiegato nel terzo o quarto paragrafo della USAGEsezione della rsync(1)pagina man.
jw013

@ jw013 Dopo aver letto ripetutamente la documentazione di rsync, mesi fa, la mia conclusione è stata che le barre finali erano un "in" implicito, sia nel primo (secondo, terzo, ecc.) che nell'ultimo argomento. Ma poi, spesso finisco i miei comandi con un / sull'ultimo argomento per implicare / richiedere un effetto "in".
assassino

La mia sensazione è quella di copiare tutti gli attributi della directory e nessun file normale sarebbe rsync -a -AX --include='*/' --exclude='*'. Non ho ancora testato
Gilles 'SO- smetti di essere malvagio' il

@ jw013 Grazie per l'aiuto nella composizione di questa risposta. Ho provato così tante opzioni nel mio piccolo ambiente di test sandbox, e ho continuato ad avvicinarmi, ma avere una parte di esso non funziona correttamente.
assassino l'

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

2
Questo non funzionerà in modo ricorsivo e credo che non copierà ACL o attributi estesi.
Mat

1
Non dovrebbe essere ricorsivo: l'OP ha chiesto "non il contenuto della directory stessa" e la risposta accettata dice a rsync --no-recursive. Il problema con questa risposta è che non esegue ACL o XATTR.
ShadSterling

0
cp -rfp from_dir to_dir
  • -r - ricorsivo
  • -f - forza
  • -p - preservare gli attributi: modalità, proprietà, timestamp

Anche bisogno di --attributes-only
smremde

0

Non capisco perché sembra funzionare per gli altri, ma il metodo rsync fallisce per me su FreeBSD con ZFS. Non accade nulla. Tuttavia, il metodo di Jean-François Dockes funziona. (vedi: https://www.lesbonscomptes.com/pxattr/ ) Directory di origine = A e directory di destinazione = B, dalla domanda originale.

pxattr -lR A > tmp.EAs

(modifica la prima riga di tmp.EAs per cambiare la directory A in B, s / A / B /)

pxattr -S tmp.EAs

Quindi, non stai solo raccomandando il metodo di qualcun altro ; stai raccomandando il programma di qualcun altro , giusto? Va bene, ma ho appena perso cinque minuti a cercare documentazione su un programma non standard poco conosciuto. Sarebbe bello se affermassi più chiaramente che stai raccomandando alle persone di scaricare un programma non standard poco conosciuto.
G-Man dice "Reinstate Monica" il

scrollata di spalle È nell'albero dei porti. Ciò non lo rende esattamente non standard. Non è così oscuro come pyxattre l'ho provato anche io. Era una specie di dado duro da decifrare. Presumibilmente gnu cp funziona per questo, ma non riesco a farlo andare. Gli attributi estesi meritano di meglio. Inoltre, pxattr funziona almeno con Linux, osx e bsd.
cira,

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

dove dst_dir - è una directory target. O:

rsync -dADXgot src_dir dst_dir

dove dst_dir - è una directory contenente la directory di destinazione o una directory di destinazione inesistente.

Dalla pagina man di 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

È necessario "-r" per copiare una directory.


2
Penso di averti frainteso, non hai bisogno dei contenuti, solo di xattr. Se fosse per SELinux, potresti usare chcon facendo riferimento alla directory originale (A).
tripledes

-rimplica la copia di tutte le sottodirectory e dei file in esse contenuti ... Non voglio copiare l'intero albero ... Voglio copiare gli attributi per una sola e una sola directory, senza influire sul suo contenuto.
Grzegorz Wierzowiecki,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.