Как клонировать / скопировать все атрибуты файла / каталога в другой файл / каталог?

15

Я хочу скопировать атрибуты (принадлежность, группа, ACL, расширенные атрибуты и т. Д.) Одного каталога в другой, но не содержимое самого каталога.

Это не работает:

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

Примечание: так не должно быть cp.

Гжегож Вежовецкий
источник
1
Вы не прошли -r, поэтому он игнорирует каталоги. Но я думаю, вы хотите скопировать только атрибуты, а не содержимое? Я могу думать только о некрасивых взломах. Также обратите внимание, что installможно сохранить контексты SELinux.
lynxlynxlynx
3
возможный дубликат владения клоном и прав доступа из другого файла?
Жиль "ТАК - перестань быть злым"
1
@ Жиль, спасибо, что указали на другую тему. Это решает часть проблемы: владение и режим. Как насчет расширенных атрибутов?
Гжегож Вежовецкий,
1
@GrzegorzWierzowiecki Боюсь, очень немногие инструменты поддерживают расширенные атрибуты. Если они важны, используйте предложение rsync от killermist.
Жиль "ТАК ... перестать быть злым"
Btw. Вот хорошие примеры, где можно увидеть xattrs в действии: GUI Dolphin в KDE: imgur.com/oguuJNm или URL, откуда был загружен файл, заданный браузерами: ссылки: gist.github.com/gwpl/a00e18bc150f1e3518335d13c5e46ad7 + freedesktop.org/ wiki / CommonExtendedAttributes + vhanda.in/blog/2014/07/tagging-your-files
Гжегож Вежовецкий

Ответы:

13

После долгих проб и ошибок в командной строке, я думаю, что нашел ответ. Но это не cpсвязанный ответ.

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

Это делает:

-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

Для справки

    --no-OPTION             turn off an implied OPTION (e.g. --no-D)
-r, --recursive             recurse into directories
killermist
источник
Последнее редактирование определенно стало хитом. С или без / на втором DIR, который, наконец, делает именно то, что просят, похоже.
убийца
Конечный слеш имеет значение только для первого аргумента, а не для второго. Это объясняется в 3-м или 4-м абзаце USAGEраздела rsync(1)справочной страницы.
jw013
@ jw013 Многократно прочитав документацию по rsync, несколько месяцев назад, я пришел к выводу, что косые черты были подразумеваемым «в», будь то первый (второй, третий и т. д.) или последний аргумент. Но опять же, я часто заканчиваю свои команды символом / на последнем аргументе, чтобы подразумевать / требовать аффекта «в».
убийца
У меня есть чувство копировать все атрибуты каталога, и никакой обычный файл не будет rsync -a -AX --include='*/' --exclude='*'. Я не проверял.
Жиль "ТАК - перестать быть злым"
@ jw013 Спасибо за помощь в наборе этого ответа. Я попробовал ОЧЕНЬ много вариантов в моей маленькой тестовой среде песочницы, и продолжал приближаться, но некоторые его части работали неправильно.
убийца
0
chmod --reference=first-dir second-dir
Этьен Дубле
источник
2
Это не будет работать рекурсивно, и я считаю, что это не будет копировать ACL или расширенные атрибуты.
Мат
1
Он не должен быть рекурсивным: OP запросил «не содержимое каталога», а принятый ответ сообщает rsync --no-recursive. Проблема с этим ответом состоит в том, что он не выполняет ACL или XATTR.
ShadSterling
0
cp -rfp from_dir to_dir
  • -r - рекурсивный
  • -f - сила
  • -p - сохранить атрибуты: режим, владение, метки времени
burtsevyg
источник
Также необходимо --attributes-only
smremde
0

Я не понимаю, потому что кажется, что он работает для других, но метод rsync не работает для меня на FreeBSD с ZFS. Ничего не произошло. Однако метод Жана-Франсуа Докса работает. (см .: https://www.lesbonscomptes.com/pxattr/ ) Исходный каталог = A & целевой каталог = B, из исходного вопроса.

pxattr -lR A > tmp.EAs

(отредактируйте первую строку tmp.EAs, чтобы изменить каталог A на B, s / A / B /)

pxattr -S tmp.EAs
чира
источник
Итак, вы не просто рекомендуете чужой метод; вы рекомендуете чужую программу , верно? Это нормально, но я просто потратил пять минут на поиск документации по малоизвестной нестандартной программе. Было бы неплохо, если бы вы более четко заявили, что рекомендуете людям загрузить малоизвестную нестандартную программу.
G-Man говорит: «Восстанови Монику»
Пожав плечами Это в дереве портов. Это не совсем делает его нестандартным. Это не так неясно, как pyxattrи я тоже. Это был своего рода крепкий орешек. Предположительно GNU CP работает для этого, но я не могу заставить его пойти. Расширенные атрибуты заслуживают лучшего, чем это. Кроме того, pxattr работает как минимум под linux, osx и bsd.
Cira
0
rsync -aAX --exclude='*' src_dir/ dst_dir

где dst_dir - целевой каталог. Или:

rsync -dADXgot src_dir dst_dir

где dst_dir - каталог, содержащий целевой каталог, или несуществующий целевой каталог.

Из справочной страницы 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
Alek
источник
-3

Вам нужен "-r" для копирования каталога.

TripleDES
источник
2
Я думаю, что я неправильно понял вас, вам не нужно содержимое, только XATTR. Если бы это было для SELinux, вы могли бы использовать chcon, ссылаясь на исходный каталог (A).
тройной
-rподразумевает копирование всех подкаталогов и файлов в них ... Я не хочу копировать все дерево ... Я хочу копировать атрибуты только для одного и только одного каталога - без ущерба для его содержимого.
Гжегож Вежовецкий