Copia i permessi dei file, ma non i file in Unix


14

(Da: /programming/15245144/copy-file-permissions-but-not-files , chiuso perché fuori tema)

Ho due copie dello stesso albero di directory. Hanno quasi gli stessi file in entrambi (una versione può avere un paio di file extra o mancanti). Tuttavia, la maggior parte dei file sono in comune con entrambe le directory (hanno gli stessi percorsi relativi e tutto il resto).

Supponiamo che siano presenti nelle directory:

version1/
version2/

Il problema è che le autorizzazioni in version1 / sono state incasinate e vorrei copiare le autorizzazioni da version2 /, ma farlo senza sostituire i file in version1 / che sono più recenti.

Esiste un modo automatizzato per farlo tramite comandi o script della shell?


Qui c'è uno script utile in perl che puoi usare serverfault.com/questions/373058/…
NoNoNo

Risposte:


15

GNU cp conosce la --attributes-onlybandiera dal coreutils 8.6

--attributes-only non copia i dati del file, ma solo gli attributi


1
La mia versione non sembra avere quella bandiera, e alcuni post sembrano avere avvisi spaventosi per esempio.
shearn89,

14

La mia versione di cpnon ha la --attributes-onlybandiera, quindi ho elaborato questo. Testato brevemente su cartelle semplici, 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

Puoi, ma non penso in modo "automatizzato"!

GNU chown e GNU chmod hanno un --reference=RFILEparametro che puoi usare.

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

Utilizza le RFILEimpostazioni (autorizzazioni, proprietario, gruppo, ecc.) E le copia in yourfile.

il manuale spiega in modo più dettagliato.


0

Nel mio caso ho risolto usando il comando "stat" con "find" e "vi" per creare uno script che applica le autorizzazioni.

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

In "vi" ho inserito in tutte le righe il comando "chmod": %s/^/chmod /g ho copiato lo script nella version2/directory ed eseguito.

Altre soluzioni sembrano valide ma non le ho testate nel caso.


0

Ispirato dalla risposta di Mariano Paniga, penso di averne uno migliore, che non ha bisogno di vi e di cercare / sostituire i comandi. Voglio persino copiare anche le informazioni sulla proprietà (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

Puoi personalizzare i comandi all'interno stat -c '...'in qualsiasi cosa tu voglia. Per tutte le opzioni disponibili, vedere man stat.


Il tuo script gestisce i nomi con newline incorporate?
Cacciatore di cervi,

@ deer-hunter Dovrebbe funzionare così com'è, in caso contrario, puoi aggiungere una citazione ".." attorno alla parte del nome file.
Tomofumi,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.