2013-03-06 8 views
33

Ich habe zwei Kopien derselben Verzeichnisstruktur. Sie haben fast die gleichen Dateien in beiden (eine Version kann einige zusätzliche oder fehlende Dateien enthalten). Die meisten Dateien sind jedoch beiden Verzeichnissen gemeinsam (haben die gleichen relativen Pfade und alles).Dateiberechtigungen kopieren, aber keine Dateien

Es sei angenommen, das sind in den Verzeichnissen:

version1/ 
version2/ 

Das Problem ist, dass die Berechtigungen in version1/wurde vermasselt, und ich würde über die Berechtigungen von version2/kopieren wollen, aber tun, ohne die Dateien zu ersetzen in Version1/die neueren sind.

Gibt es einen automatisierten Weg, dies über Bash zu tun? (Es muss nicht bash sein, es könnte auch eine andere Methode/Programmiersprache sein).

+0

Ich habe eine neue Frage in ServerFault zu diesem Thema erstellt: [Kopieren Sie Dateiberechtigungen, aber keine Dateien in Unix] (http://serverfault.com/questions/665237/copy-file-permissions-but- not-files-in-unix) –

Antwort

66

sollten Sie einen Blick auf die --reference Option für chmod:

chmod --reference version2/somefile version1/somefile 

Bewerben find und xargs in passender Art und Weise, und Sie sollten wie

~/version2$ find . -type f | xargs -I {} chmod --reference {} ../version1/{} 

dieser auch funktioniert gut, also etwas, rekursiv, und ist robust gegen fehlende Dateien im Zielverzeichnis (Balken Keine solche Datei ... Fehler, die ignoriert werden können). Natürlich wird es nichts mit Dateien machen, die nur im Zielverzeichnis existieren.

Cheers,

+0

Nur um zu conf irm, im obigen Befehl ändert sich Version 2, um Version 1 zu entsprechen und nicht umgekehrt? Schließlich ist dies robust gegen fehlende Dateien? – user788171

+1

Nein bzw. Nein. –

+1

Um es auszuarbeiten, kopiert es die Dauerwellen vom aktuellen Verzeichnis zu Version1, und ich bin mir nicht sicher, ob 'xargs' fortfahren wird, wenn es keine übereinstimmende Datei im Zielverzeichnis gibt - Sie sollten testen, bevor Sie auf Ihrem Live-FS laufen. –

0

chmod Inhaber gruppen andere ./dir oder ./file vielleicht?

Wenn die Berechtigungen nicht feinkörnig sind und sich von einer Datei zur anderen unterscheiden, können Sie ein rekursives chmod für das Verzeichnis ausführen und die Berechtigungen vereinheitlichen.

Siehe man chmod für Verweise auf die Optionen, die

7

nützlich sein könnten Sie das Skript verwenden könnte

#!/bin/sh 
chmod --reference $1 $2 
if [ -d $1 ] 
then 
    if [ "x`ls $1`" != "x" ] 
    then 
     for f in `ls $1` 
     do 
      $0 $1/$f $2/$f 
     done 
    fi 
fi 

Run (es die Berechtigungen rekursiv sondern individuell für jede Datei/Verzeichnis ändert) das Skript mit Argumente Version2 Version1