Kopiere Dateiberechtigungen, aber keine Dateien in Unix

14

(Von: /programming/15245144/copy-file-permissions-but-not-files , geschlossen, weil Off-Topic)

Ich habe zwei Kopien des gleichen Verzeichnisbaums. Sie haben fast die gleichen Dateien in beiden (eine Version kann ein paar zusätzliche oder fehlende Dateien haben). Die meisten Dateien sind jedoch beiden Verzeichnissen gemeinsam (haben dieselben relativen Pfade und alles).

Angenommen, diese befinden sich in Verzeichnissen:

version1/
version2/

Das Problem ist, dass die Berechtigungen in Version 1 / durcheinander geraten sind und ich die Berechtigungen aus Version 2 / überschreiben möchte, aber ohne die Dateien in Version 1 / zu ersetzen, die neuer sind.

Gibt es eine automatisierte Möglichkeit, dies über Shell-Befehle oder Skripte zu tun?

Mariano Paniga
quelle
Hier gibt es ein nützliches Skript in Perl, das Sie unter serverfault.com/questions/373058/…
NoNoNo

Antworten:

15

GNU cp kennt das --attributes-onlyFlag seit Coreutils 8.6

--attributes-only kopiert nicht die Dateidaten, sondern nur die Attribute

Tom Aac
quelle
1
Meine Version scheint diese Flagge nicht zu haben, und einige Posts scheinen zum Beispiel
shearn89
14

Meine Version von cphat die --attributes-onlyFlagge nicht, also habe ich das aufgearbeitet. Kurz auf einfache Ordner getestet, 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
quelle
5

Sie können, aber ich denke nicht "automatisiert"!

GNU chown und GNU chmod haben einen --reference=RFILEParameter, den Sie verwenden können.

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

Es verwendet RFILEEinstellungen (Berechtigungen, Eigentümer, Gruppe usw.) und kopiert sie nach yourfile.

das Handbuch erklärt es genauer.

Feiticeir0
quelle
0

In meinem Fall habe ich mithilfe des Befehls "stat" mit "find" und "vi" ein Skript erstellt, das Berechtigungen anwendet.

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

In "vi" habe ich in alle Zeilen den Befehl "chmod" eingefügt: %s/^/chmod /g Ich habe das Skript in das version2/Verzeichnis kopiert und ausgeführt.

Andere Lösungen scheinen gültig zu sein, ich habe sie jedoch nicht getestet.

Mariano Paniga
quelle
0

Inspiriert von Mariano Panigas Antwort, denke ich, dass ich eine bessere habe, die keine vi und Suchen / Ersetzen-Befehle benötigt. Ich möchte sogar die Besitzdaten mitkopieren (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

Sie können die darin enthaltenen Befehle beliebig anpassen stat -c '...'. Alle verfügbaren Optionen finden Sie unter man stat.

Tomofumi
quelle
Verarbeitet Ihr Skript Namen mit eingebetteten Zeilenumbrüchen?
Deer Hunter
@ deer-hunter Es sollte so funktionieren, wie es ist. Wenn nicht, können Sie ein Anführungszeichen ".." um den Dateinamenteil einfügen.
Tomofumi