Назад | Перейти на главную страницу

Копировать права доступа к файлам, но не к файлам в Unix

(Из : 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.