Скопіюйте дозволи файлів, але не файли в 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-тільки не копіює файлові дані, а лише атрибути


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

5

Можна, але я не думаю "автоматизованим способом"!

GNU chown та GNU chmod мають --reference=RFILEпараметр, який можна використовувати.

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

Він використовує RFILEналаштування (дозволи, власник, група тощо) та копіює їх у yourfile.

посібник пояснює більш докладно.


0

У моєму випадку я вирішив за допомогою команд "stat" за допомогою "find" і "vi", щоб створити сценарій, що застосовує дозволи.

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

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

Інші рішення здаються дійсними, але я їх не перевіряв на випадок.


0

Натхненний відповіддю Маріано Паніги, я думаю, що в мене є кращий, якому не потрібно виконувати пошук та замінювати команди. Я навіть хочу скопіювати інформацію про право власності (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.


Чи обробляє ваш сценарій імена вбудованими новими рядками?
Мисливець на олень

@ deer-hunter Це повинно працювати як є, якщо ні, ви можете додати цитату ".." навколо частини імені файлу.
Томофумі
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.