Kopiuj uprawnienia do plików, ale nie do plików w systemie Unix

14

(Od: /programming/15245144/copy-file-permissions-but-not-files , zamknięte, ponieważ nie na temat)

Mam dwie kopie tego samego drzewa katalogów. W obu mają prawie te same pliki (jedna wersja może zawierać kilka dodatkowych lub brakujących plików). Jednak większość plików jest wspólna dla obu katalogów (mają te same ścieżki względne i wszystko).

Załóżmy, że znajdują się one w katalogach:

version1/
version2/

Problem polega na tym, że uprawnienia w wersji 1 / zostały pomieszane i chciałbym skopiować uprawnienia z wersji 2 /, ale rób to bez zastępowania plików w wersji 1 /, które są nowsze.

Czy istnieje zautomatyzowany sposób na wykonanie tego za pomocą poleceń powłoki lub skryptów?

Mariano Paniga
źródło
Tutaj jest przydatny skrypt w perlu, którego możesz użyć serverfault.com/questions/373058
NoNoNo

Odpowiedzi:

15

GNU cp zna --attributes-onlyflagę od coreutils 8.6

--attributes-only nie kopiuje danych pliku, tylko atrybuty

Tom Aac
źródło
1
Wydaje się, że moja wersja nie ma tej flagi, a niektóre posty wydają się mieć na przykład
shearn89
14

Moja wersja cpnie ma --attributes-onlyflagi, więc to poprawiłem. Krótko przetestowany na prostych folderach, 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
źródło
5

Możesz, ale nie sądzę w „zautomatyzowany sposób”!

GNU chown i GNU chmod mają --reference=RFILEparametr, którego możesz użyć.

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

Wykorzystuje RFILEustawienia (uprawnienia, właściciela, grupę itp.) I kopiuje je do yourfile.

instrukcja wyjaśnia bardziej szczegółowo.

Feiticeir0
źródło
0

W moim przypadku rozwiązałem to za pomocą polecenia „stat” z „find” i „vi”, aby utworzyć skrypt, który stosuje uprawnienia.

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

Do „vi” wstawiłem do wszystkich wierszy polecenie „chmod”: %s/^/chmod /g skopiowałem skrypt do version2/katalogu i wykonałem go.

Inne rozwiązania wydają się aktualne, ale nie testowałem ich na wszelki wypadek.

Mariano Paniga
źródło
0

Zainspirowany odpowiedzią Mariano Panigi, myślę, że mam lepszą, która nie musi vi i wyszukiwać / zamieniać poleceń. Chcę nawet skopiować informacje o własności (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

Możesz dostosować zawarte w nim polecenia stat -c '...'w dowolny sposób. Wszystkie dostępne opcje patrz man stat.

Tomofumi
źródło
Czy twój skrypt obsługuje nazwy z osadzonymi znakami nowej linii?
Deer Hunter
@ deer-hunter Powinno działać tak, jak jest, jeśli nie, możesz dodać cytat „..” wokół części nazwy pliku.
Tomofumi,