(Из : https://stackoverflow.com/questions/15245144/copy-file-permissions-but-not-files, закрыто, потому что не по теме)
У меня есть две копии одного и того же дерева каталогов. У них почти одинаковые файлы в обоих (в одной версии может быть пара лишних или отсутствующих файлов). Однако большинство файлов являются общими для обоих каталогов (имеют одинаковые относительные пути и все остальное).
Предположим, они находятся в каталогах:
version1/
version2/
Проблема в том, что разрешения в версии 1 / испортились, и я хотел бы скопировать разрешения из версии 2 /, но сделать это без замены файлов в версии 1 /, которые более новые.
Есть ли автоматический способ сделать это с помощью команд оболочки или сценариев?
GNU cp знает --attributes-only
флаг с coreutils 8.6
--attributes-only не копировать данные файла, только атрибуты
Моя версия cp
не имеет --attributes-only
flag, поэтому я работал над этим. Кратко протестировал на простых папках YMMV.
$> ls
version1/
version2/
$> ls -l version1/1/a
-rw-rw-r-- 1 alex alex 0 Feb 5 12:49 version1/1/a
$> ls -l version2/1/a
-rwxrwxrwx 1 alex alex 0 Feb 5 12:49 version1/1/a
$> find version1 -type f -printf '%P\n' | xargs -I {} \
chmod --reference=version1/{} version2/{}
$> ls -l version2/1/a
-rw-rw-r-- 1 alex alex 0 Feb 5 12:49 version1/1/a
Вы можете, но я не думаю, что это «автоматизированный способ»!
GNU chown и GNU chmod имеют --reference=RFILE
параметр, который вы можете использовать.
chown --reference=RFILE yourfile
chmod --reference=RFILE yourfile
Оно использует RFILE
настройки (разрешения, владелец, группа и т. д.) и копирует их в yourfile
.
руководство объясняет более подробно.
В моем случае я решил, используя команду «stat» с «find» и «vi» для создания сценария, который применяет разрешения.
cd version1/
find . -exec stat -c '%a %n' "{}" \; > setPerm.sh
vi setPerm.sh
В "vi" я вставил во все строки команду "chmod": %s/^/chmod /g
Я скопировал сценарий в version2/
каталог и выполнил его.
Другие решения кажутся допустимыми, но я не тестировал их на всякий случай.
Вдохновленный ответом Мариано Паниги, я думаю, что у меня есть лучший вариант, которому не нужно использовать vi и команды поиска / замены. Я даже хочу скопировать информацию о владельце (uid / gid).
cd version1/
find . -exec stat -c 'chmod %a %n; chown %U:%G %n' "{}" \; > /tmp/setPerm.sh
chmod u+x /tmp/setPerm.sh
cd ../version2
/tmp/setPerm.sh
Вы можете настроить команды внутри stat -c '...'
во что угодно. Для всех доступных опций см. man stat
.