GNU/Linux >> Tutoriels Linux >  >> Linux

Linux ext4 restaurer les droits d'accès au fichier et au répertoire après une mauvaise sauvegarde/restauration

La solution standard recommandée est simple :

find . -type d -exec chmod 0755 "{}" \+
find . -type f -exec chmod 0644 "{}" \+

Cela ajoutera autant de noms de fichiers que possible en tant qu'arguments à une seule commande, jusqu'à la longueur maximale de la ligne de commande du système. Si la ligne dépasse cette longueur, la commande sera appelée plusieurs fois.

Si vous souhaitez appeler la commande une fois par fichier, vous pouvez à la place :

find . -type d -exec chmod 0755 "{}" \;
find . -type f -exec chmod 0644 "{}" \;

chmod -R a=,u+rwX,go+rX $DIR semble fonctionner correctement et est très probablement le plus rapide, quelle que soit la façon dont vous le regardez.

(J'ai vérifié avec strace , et cela n'en fait qu'un un fchmodat() syscall par fichier/répertoire -- pour les fichiers avec 644 et pour les répertoires avec 755).

L'astuce est le X autorisation, documentée dans man chmod , qui agit comme x pour les annuaires uniquement -- la distinction que vous souhaitiez.

Ce qui n'est pas documenté est ma conjecture qu'ils seraient appliqués dans le même ordre qu'ils sont spécifiés, et pas seulement dans un ordre aléatoire, mais des tests répétés avec plusieurs variantes m'ont convaincu qu'ils fonctionnent effectivement dans l'ordre donné, donc je suis assez sûr cela fonctionnera toujours comme ça.

Je devrais mentionner que c'est sous Linux, bien qu'une lecture rapide de la page de manuel BSD pour chmod suggère qu'il devrait y travailler aussi.


J'ai comparé la réponse de sitaram, le commentaire de Peter Cordes, la réponse de Fanatique et la réponse de harrymc, mais cette réponse a le moyen le plus rapide .

Moyennes :

  • Réponse de Deltik* – 7,480 secondes
  • Réponse de sitaram – 12,962 secondes (73,275 % plus lente que la meilleure)
  • Commentaire de Peter Cordes :14,414 secondes (92,685 % plus lent que le meilleur)
  • Réponse de Fanatique :14,570 secondes (94,772 % plus lente que la meilleure)
  • Réponse mise à jour de harrymc – 14,791 secondes (97,730 % plus lente que la meilleure)
  • Réponse originale de harrymc – 1 061,926 secondes (14 096,113 % plus lente que la meilleure)

Résumé statistique complet :

Author              N      min     q1      median  q3      max     mean    stddev
------------------  --     ------- ------- ------- ------- ------- ------- --------
Deltik              10     7.121   7.3585  7.4615  7.558   8.005   7.4804  0.248965
sitaram             10     12.651  12.803  12.943  13.0685 13.586  12.9617 0.276589
Peter Cordes        10     14.096  14.2875 14.375  14.4495 15.101  14.4136 0.269732
Fanatique           10     14.219  14.512  14.5615 14.6525 14.892  14.5697 0.211788
harrymc (updated)   10     14.38   14.677  14.8595 14.9025 15.119  14.791  0.21817
harrymc (original)  1      1061.93 1061.93 1061.93 1061.93 1061.93 1061.93 N/A

Commande de Deltik, au format benchmark :

find "$(pwd)" -type d | xargs -P4 chmod 755 & \
find "$(pwd)" -type f | xargs -P4 chmod 644 & wait

Commande de sitaram, au format benchmark :

chmod -R a=,u+rwX,go+rX "$(pwd)"

Commande de Peter Cordes, au format benchmark :

find "$(pwd)" \( -type d -exec chmod 755 {} + \) \
           -o \( -type f -exec chmod 644 {} + \)

Commande de Fanatique, au format benchmark :

find "$(pwd)" -type d -print0 | xargs -0 chmod 755 ; \
find "$(pwd)" -type f -print0 | xargs -0 chmod 644

Commande mise à jour de harrymc, au format de référence :

find "$(pwd)" -type d -exec chmod 755 {} + ; \
find "$(pwd)" -type f -exec chmod 644 {} +

La commande originale de harrymc, au format de référence :

find "$(pwd)" -type d -exec chmod 755 {} \; ; \
find "$(pwd)" -type f -exec chmod 644 {} \;

Ma commande a été la plus rapide grâce aux quatre parallèles chmod processus par type de fichier. Cela a permis à plusieurs cœurs de processeur d'exécuter chmod , ce qui déplace le goulot d'étranglement vers les threads d'E/S du noyau ou le disque.

La commande de sitaram était la deuxième car tout est fait dans le chmod commande. Cela réduit considérablement les frais généraux par rapport aux autres réponses car :

  • Les fichiers n'ont besoin d'être scannés qu'une seule fois (similaire à faire un find au lieu de deux), et
  • Aucun processus enfant ne doit être créé.

Cette commande est cependant la moins flexible, car elle repose sur une astuce impliquant la signification différente du bit exécutable entre les fichiers et les répertoires normaux.

Le commentaire de Peter Cordes, qui utilise un find commande, empêche les doubles recherches d'entrées de répertoire. Plus il y a de fichiers, plus cette amélioration est substantielle. Il a toujours la surcharge de création de l'enfant chmod processus, c'est pourquoi il est un peu plus lent que le chmod -seule solution.

Entre la commande de Fanatique et la commande mise à jour de harrymc, find redirigé vers xargs (find | xargs ) était plus rapide car le flux de résultats est traité de manière asynchrone. Au lieu de find suspendre son comportement de recherche pour -exec , les résultats trouvés sont envoyés à xargs pour le traitement simultané.
(Le délimiteur d'octet nul (find -print0 | xargs -0 ) ne semble pas affecter le temps d'exécution.)

La commande originale de harrymc était trop lente à cause de la surcharge d'un nouveau chmod commande pour chaque fichier et dossier, chacun exécuté dans l'ordre.

Dans la configuration de test, il y avait 1 000 002 fichiers normaux contenus dans 1 001 répertoires :

[email protected]:~# echo {0..999} | xargs mkdir -p
[email protected]:~# find -type d -exec bash -c "cd {}; echo {0..999} | xargs touch" \;
[email protected]:~# find | wc -l
1001003
[email protected]:~# find -type d | wc -l
1001
[email protected]:~# find -type f | wc -l
1000002

J'ai défini tous les fichiers et dossiers pour qu'ils aient 777 autorisations, comme les conditions initiales de la question.

Ensuite, j'ai comparé les commandes dix fois, en restaurant à chaque fois les autorisations à 777 avec chmod -R 0777 "$(pwd)" avant d'exécuter le test.

Avec OUTPUT représentant un fichier contenant la sortie de chaque commande de référence, j'ai calculé le temps moyen en utilisant :

bc <<< "scale=3; ($(grep real OUTPUT | grep -Po '(?<=m).*(?=s)' | xargs | sed 's/ /+/g'))/10"

Résultats du benchmark de la réponse de Deltik

[email protected]:~# for i in {0..9} ; do chmod -R 0777 "$(pwd)" ; time { find "$(pwd)" -type d | xargs -P4 chmod 755 & find "$(pwd)" -type f | xargs -P4 chmod 644 & wait ; } ; done
[1] 9791
[2] 9793
[1]-  Done                    find "$(pwd)" -type d | xargs -P4 chmod 755
[2]+  Done                    find "$(pwd)" -type f | xargs -P4 chmod 644

real    0m7.634s
user    0m2.536s
sys     0m23.384s
[1] 9906
[2] 9908
[1]-  Done                    find "$(pwd)" -type d | xargs -P4 chmod 755
[2]+  Done                    find "$(pwd)" -type f | xargs -P4 chmod 644

real    0m7.443s
user    0m2.636s
sys     0m23.106s
[1] 10021
[2] 10023
[1]-  Done                    find "$(pwd)" -type d | xargs -P4 chmod 755
[2]+  Done                    find "$(pwd)" -type f | xargs -P4 chmod 644

real    0m8.005s
user    0m2.672s
sys     0m24.557s
[1] 10136
[2] 10138
[1]-  Done                    find "$(pwd)" -type d | xargs -P4 chmod 755
[2]+  Done                    find "$(pwd)" -type f | xargs -P4 chmod 644

real    0m7.480s
user    0m2.541s
sys     0m23.699s
[1] 10251
[2] 10253
[1]-  Done                    find "$(pwd)" -type d | xargs -P4 chmod 755
[2]+  Done                    find "$(pwd)" -type f | xargs -P4 chmod 644

real    0m7.397s
user    0m2.558s
sys     0m23.583s
[1] 10366
[2] 10368
[1]-  Done                    find "$(pwd)" -type d | xargs -P4 chmod 755
[2]+  Done                    find "$(pwd)" -type f | xargs -P4 chmod 644

real    0m7.482s
user    0m2.601s
sys     0m23.728s
[1] 10481
[2] 10483
[1]-  Done                    find "$(pwd)" -type d | xargs -P4 chmod 755
[2]+  Done                    find "$(pwd)" -type f | xargs -P4 chmod 644

real    0m7.679s
user    0m2.749s
sys     0m23.395s
[1] 10596
[2] 10598
[1]-  Done                    find "$(pwd)" -type d | xargs -P4 chmod 755
[2]+  Done                    find "$(pwd)" -type f | xargs -P4 chmod 644

real    0m7.243s
user    0m2.583s
sys     0m23.400s
[1] 10729
[2] 10731
[1]-  Done                    find "$(pwd)" -type d | xargs -P4 chmod 755
[2]+  Done                    find "$(pwd)" -type f | xargs -P4 chmod 644

real    0m7.320s
user    0m2.640s
sys     0m23.403s
[1] 10844
[2] 10847
[1]-  Done                    find "$(pwd)" -type d | xargs -P4 chmod 755
[2]+  Done                    find "$(pwd)" -type f | xargs -P4 chmod 644

real    0m7.121s
user    0m2.490s
sys     0m22.943s

Temps moyen :7.480 secondes

Résultats du benchmark de la réponse de sitaram

[email protected]:~# for i in {0..9} ; do chmod -R 0777 "$(pwd)" ; time chmod -R a=,u+rwX,go+rX "$(pwd)" ; done

real    0m12.860s
user    0m0.940s
sys     0m11.725s

real    0m13.059s
user    0m0.896s
sys     0m11.937s

real    0m12.819s
user    0m0.945s
sys     0m11.706s

real    0m13.078s
user    0m0.855s
sys     0m12.000s

real    0m12.653s
user    0m0.856s
sys     0m11.667s

real    0m12.787s
user    0m0.820s
sys     0m11.834s

real    0m12.651s
user    0m0.916s
sys     0m11.578s

real    0m13.098s
user    0m0.939s
sys     0m12.004s

real    0m13.586s
user    0m1.024s
sys     0m12.372s

real    0m13.026s
user    0m0.976s
sys     0m11.910s

Temps moyen :12,962 secondes

Résultats du benchmark du commentaire de Peter Cordes

[email protected]:~# for i in {0..9} ; do chmod -R 0777 "$(pwd)" ; time find "$(pwd)" \( -type d -exec chmod 755 {} + \) -o \( -type f -exec chmod 644 {} + \) ; done

real    0m14.096s
user    0m1.455s
sys     0m12.456s

real    0m14.492s
user    0m1.398s
sys     0m12.897s

real    0m14.309s
user    0m1.518s
sys     0m12.576s

real    0m14.451s
user    0m1.477s
sys     0m12.776s

real    0m15.101s
user    0m1.554s
sys     0m13.378s

real    0m14.223s
user    0m1.470s
sys     0m12.560s

real    0m14.266s
user    0m1.459s
sys     0m12.609s

real    0m14.357s
user    0m1.415s
sys     0m12.733s

real    0m14.393s
user    0m1.404s
sys     0m12.830s

real    0m14.448s
user    0m1.492s
sys     0m12.717s

Temps moyen :14,414 secondes

Résultats du benchmark de la réponse de Fanatique

[email protected]:~# for i in {0..9} ; do chmod -R 0777 "$(pwd)" ; time { find "$(pwd)" -type d -print0 | xargs -0 chmod 755 ; find "$(pwd)" -type f -print0 | xargs -0 chmod 644 ; } ; done

real    0m14.561s
user    0m1.991s
sys     0m13.343s

real    0m14.521s
user    0m1.958s
sys     0m13.352s

real    0m14.696s
user    0m1.967s
sys     0m13.463s

real    0m14.562s
user    0m1.875s
sys     0m13.400s

real    0m14.609s
user    0m1.841s
sys     0m13.533s

real    0m14.892s
user    0m2.050s
sys     0m13.630s

real    0m14.291s
user    0m1.885s
sys     0m13.182s

real    0m14.843s
user    0m2.066s
sys     0m13.578s

real    0m14.219s
user    0m1.837s
sys     0m13.145s

real    0m14.503s
user    0m1.803s
sys     0m13.419s

Temps moyen :14.570 secondes

Résultats du benchmark de la réponse mise à jour de harrymc

[email protected]:~# for i in {0..9} ; do chmod -R 0777 "$(pwd)" ; time { find "$(pwd)" -type d -exec chmod 755 {} + ; find "$(pwd)" -type f -exec chmod 644 {} + ; } ; done

real    0m14.975s
user    0m1.728s
sys     0m13.050s

real    0m14.710s
user    0m1.586s
sys     0m12.979s

real    0m14.644s
user    0m1.641s
sys     0m12.872s

real    0m14.927s
user    0m1.706s
sys     0m13.036s

real    0m14.867s
user    0m1.597s
sys     0m13.086s

real    0m15.119s
user    0m1.666s
sys     0m13.259s

real    0m14.878s
user    0m1.590s
sys     0m13.098s

real    0m14.852s
user    0m1.681s
sys     0m13.045s

real    0m14.380s
user    0m1.603s
sys     0m12.663s

real    0m14.558s
user    0m1.514s
sys     0m12.899s

Temps moyen :14,791 secondes

Résultats du benchmark de la réponse originale de harrymc

En raison de la lenteur de cette commande, je n'ai exécuté le benchmark qu'une seule fois.

[email protected]:~# for i in {0..0} ; do chmod -R 0777 "$(pwd)" ; time { find "$(pwd)" -type d -exec chmod 755 {} \; ; find "$(pwd)" -type f -exec chmod 644 {} \; ; } ; done

real    17m41.926s
user    12m26.896s
sys     4m58.332s

Temps pris :1061,926 secondes


Linux
  1. Comment restaurer le répertoire /tmp supprimé sous Linux

  2. Comment sauvegarder et restaurer le référentiel SVN sous Linux

  3. Comment sauvegarder et restaurer la base de données Postgres

  4. Ubuntu – Système simple et sauvegarde/restauration de fichiers pour Linux ?

  5. Comment sauvegarder et restaurer une base de données dans PostgreSQL

Comment sauvegarder et restaurer des fichiers à l'aide de BorgBackup sous Linux

Sauvegarder et restaurer les paramètres du système de bureau Linux avec Dconf

Restaurer l'autorisation exécutable pour la commande Chmod sous Linux

Comment utiliser Timeshift pour sauvegarder et restaurer Linux

Sauvegarde et restauration d'instantanés LVM sous Linux

Comment sauvegarder et restaurer un site Web WordPress