Linux: Synchronisieren Sie zwei Verzeichnisberechtigungen, Benutzer und Gruppen, und lassen Sie den Dateiinhalt unberührt

8

In meiner Linux-Box habe ich zwei Verzeichnisse:

  • Arbeitsdateien mit falschen Berechtigungen
  • ältere Versionen derselben Dateien mit den richtigen Berechtigungen (Berechtigungen und Benutzer und Gruppen)

Ich muss die Berechtigungen nur synchronisieren, ohne den Dateiinhalt zu ändern. Ich habe rsync ausprobiert, kann aber keine geeignete Option finden. Kannst du mir einen Rat geben?

Danke im Voraus.

BEARBEITEN

Dank Ihrer Vorschläge habe ich dieses Skript. Die Teilbaumberechtigungen werden rekursiv geändert:

#!/bin/bash
cd good
find $1/* | while read DIR
do
 chown --reference="$DIR" "/bad/$DIR"
 chmod --reference="$DIR" "/bad/$DIR"
done

Kein Meisterwerk, aber es funktioniert bei mir.

Massimog
quelle
2
Verwenden Sie eine for-Schleife über die Dateien und führen Sie sie dann für jede Datei chmod --reference=ReferenceFileundchown --reference=ReferenceFile
mailq
Sofern nicht etwas anderes dran ist, sollte Maliqs Vorschlag funktionieren. Brüllen Sie einfach, wenn Sie Hilfe mit dem Skript benötigen.
Jeffery Smith

Antworten:

7

Sie können den --reference=fileSchalter sowohl auf chmod als auch auf chown verwenden , um dies zu tun, z

#!/bin/bash
for FILE  in /path/to/good/directory/*
do
    chown --reference="$FILE" /path/to/bad/directory/"$(basename "$FILE")"
    chmod --reference="$FILE" /path/to/bad/directory/"$(basename "$FILE")"
done
user9517
quelle
0

Sie können dies versuchen. Sie benötigen absolute Pfade für die beiden für dieses Skript erforderlichen Argumente. Führen Sie es wie folgt aus: copyperms.sh source_dir target_dir

Hier ist das Skript: cat copyperms.sh

#!/bin/bash

srcDir="$1"
targDir="$2"

if [ -z "$srcDir" ] || [ -z "$targDir" ]; then
    echo "Required argument missing."
elif [ ! -d "$srcDir" ] || [ ! -d "$targDir" ] ; then
    echo "Source and target not both directories."
    exit
else
    cd $srcDir

    echo "Source directory: $srcDir; Target directory: $targDir"
    echo "Matching permissions and ownerships .."
    find . -print0 | xargs -0I {} echo {} | xargs -I {} chmod --reference "{}" "$targDir/{}"
    find . -print0 | xargs -0I {} echo {} | xargs -I {} chown --reference "{}" "$targDir/{}"
    # find . | while read name
    # do
    #   chmod --reference "$name" "$targDir/$name"
    #   chown --reference "$name" "$targDir/$name"
    # done
    echo ".. done!"
fi

Kann durch Verwendung der auskommentierten while-Schleife für weitere Zwecke angepasst werden, ist jedoch langsamer.

$ time mperms / adp / code / adp / safe / code

Verwenden von xargs:

real 0m0.107s Benutzer 0m0.008s sys 0m0.004s

Verwenden der while-Schleife:

real 0m0.234s Benutzer 0m0.012s sys 0m0.028s sys 0m0.028s

Randy Skretka
quelle