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

14

(От: /programming/15245144/copy-file-permissions-but-not-files , закрыт, поскольку не по теме)

У меня есть две копии одного и того же дерева каталогов. Они почти имеют одинаковые файлы в обеих (одна версия может иметь пару дополнительных или отсутствующих файлов). Однако большинство файлов являются общими для обоих каталогов (имеют одинаковые относительные пути и все).

Предположим, это в каталогах:

version1/
version2/

Проблема в том, что разрешения в версии 1 / испортились, и я хотел бы скопировать разрешения из версии 2 /, но сделать это без замены файлов в версии 1 /, которые являются более новыми.

Есть ли автоматический способ сделать это с помощью команд оболочки или сценариев?

Мариано Панига
источник
Здесь есть полезный скрипт на Perl, который вы можете использовать serverfault.com/questions/373058/…
NoNoNo

Ответы:

15

GNU cp знает --attributes-onlyфлаг, начиная с coreutils 8.6

--attributes-only не копировать данные файла, только атрибуты

Том Аак
источник
1
Моя версия, похоже, не имеет такого флага, а некоторые сообщения, например, содержат страшные предупреждения .
shearn89
14

Моя версия cpне имеет --attributes-onlyфлага, поэтому я решил это. Кратко проверено на простых папках 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
shearn89
источник
5

Вы можете, но я не думаю, что "автоматизированным способом"!

У GNU chown и GNU chmod есть --reference=RFILEпараметр, который вы можете использовать.

chown --reference=RFILE yourfile
chmod --reference=RFILE yourfile

Он использует RFILEнастройки (права доступа, владелец, группа и т. Д.) И копирует их в yourfile.

Руководство объясняет более подробно.

Feiticeir0
источник
0

В моем случае я решил с помощью команды «stat» с «find» и «vi», чтобы создать скрипт, который применяет разрешения.

cd version1/
find . -exec stat -c '%a %n' "{}" \; > setPerm.sh
vi setPerm.sh

В "vi" я вставил во все строки команду "chmod": %s/^/chmod /g я скопировал скрипт в version2/каталог и выполнил его.

Другие решения кажутся действительными, но я не проверял их в случае.

Мариано Панига
источник
0

Вдохновленный ответом Мариано Паниги, я думаю, что у меня есть лучший вариант, который не требует команд 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.

Tomofumi
источник
Ваш скрипт обрабатывает имена со встроенными символами новой строки?
Охотник на оленей
@ deer-hunter Это должно работать как есть, если нет, вы можете добавить кавычку ".." вокруг части имени файла.
Томофуми,