GNU/Linux >> Znalost Linux >  >> Linux

Linux ext4 obnovit přístupová práva k souborům a adresářům po špatném zálohování/obnovení

Standardní doporučené řešení je přímočaré:

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

Tím se k jednomu příkazu připojí co nejvíce názvů souborů jako argumentů až do maximální délky příkazového řádku systému. Pokud řádek překročí tuto délku, příkaz bude volán vícekrát.

Pokud chcete volat příkaz jednou na soubor, můžete místo toho udělat:

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

chmod -R a=,u+rwX,go+rX $DIR Zdá se, že funguje dobře a je velmi pravděpodobné, že bude nejrychlejší, ať se na to podíváte jakkoli.

(Ověřil jsem pomocí strace a tvoří pouze jeden fchmodat() syscall na soubor/adresář -- pro soubory s 644 a pro adresáře s 755).

Trik je X povolení, zdokumentované v man chmod , který funguje jako x pouze pro adresáře -- přesně ten rozdíl, který jste chtěli.

Co není zdokumentován je můj odhad, že by byly aplikovány ve stejném pořadí, v jakém jsou specifikovány, a ne jen v nějakém náhodném pořadí, ale opakované testy s několika variantami mě přesvědčily, že skutečně běží v daném pořadí, takže jsem si docela jistý takhle to bude fungovat vždycky.

Měl bych zmínit, že je to na Linuxu, i když letmé přečtení manuálové stránky BSD pro chmod naznačuje, že by to mělo pracovat tam také.


Porovnal jsem odpověď sitaramu, komentář Petera Cordese, odpověď Fanatique a odpověď harrymca, ale tato odpověď má nejrychlejší způsob .

Průměry:

  • Deltikova odpověď* – 7,480 sekund
  • sitaramova odpověď – 12,962 sekund (73,275 % pomalejší než nejlepší)
  • Komentář Petera Cordese – 14,414 sekund (o 92,685 % pomalejší než nejlepší)
  • Odpověď Fanatique – 14,570 sekund (o 94,772 % pomalejší než nejlepší)
  • aktualizovaná odpověď harrymca – 14,791 sekund (o 97,730 % pomalejší než nejlepší)
  • Harrymcova původní odpověď – 1061,926 sekund (14096,113 % pomalejší než nejlepší)

Úplné statistické shrnutí:

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

Deltikův příkaz ve formátu benchmarku:

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

příkaz sitaramu ve formátu benchmarku:

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

Příkaz Petera Cordese ve formátu benchmarku:

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

Příkaz Fanatique ve formátu benchmarku:

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

aktualizovaný příkaz harrymca ve formátu benchmark:

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

původní příkaz harrymca ve formátu benchmarku:

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

Můj příkaz byl nejrychlejší díky čtyřem paralelním chmod procesy podle typu souboru. To umožnilo spustit více jader CPU chmod , což posouvá úzké hrdlo směrem k jaderným I/O vláknům nebo k disku.

Příkaz sitaramu byl na druhém místě, protože vše se děje v rámci chmod příkaz. To podstatně snižuje režii ve srovnání s ostatními odpověďmi, protože:

  • Soubory stačí naskenovat pouze jednou (podobně jako jeden find místo dvou) a
  • Není třeba vytvářet žádné podřízené procesy.

Tento příkaz je však nejméně flexibilní, protože se spoléhá na trik zahrnující rozdílný význam spustitelného bitu mezi běžnými soubory a adresáři.

Komentář Petera Cordese, který používá jeden find příkaz, zabraňuje dvojitému vyhledávání položek adresáře. Čím více souborů je, tím výraznější je toto vylepšení. Stále má režii na vytvoření potomka chmod procesy, což je důvod, proč je o něco pomalejší než chmod -jediné řešení.

Mezi příkazem Fanatique a aktualizovaným příkazem harrymca, find přesměrován do xargs (find | xargs ) byl rychlejší, protože proud výsledků je zpracováván asynchronně. Místo find pozastavení vyhledávání pro -exec , nalezené výsledky jsou odeslány na xargs pro souběžné zpracování.
(Oddělovač nulového bajtu (find -print0 | xargs -0 ) nezdálo se, že by to ovlivnilo dobu běhu.)

Původní příkaz harrymca byl příliš pomalý kvůli režii nového chmod příkaz pro každý jednotlivý soubor a složku, každý provedený postupně.

V testovacím nastavení bylo 1000002 běžných souborů obsažených v 1001 adresářích:

[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

Všechny soubory a složky jsem nastavil na 777 oprávnění, jako jsou počáteční podmínky otázky.

Poté jsem desetkrát porovnal příkazy a pokaždé obnovil oprávnění na 777 s chmod -R 0777 "$(pwd)" před spuštěním testu.

S OUTPUT představující soubor, který obsahuje výstup každého příkazu benchmarku, vypočítal jsem průměrný čas pomocí:

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

Výsledky benchmarku Deltikovy odpovědi

[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

Průměrný čas:7,480 sekund

Výsledky benchmarku odpovědi 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

Průměrný čas:12,962 sekund

Výsledky benchmarku komentáře Petera Cordese

[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

Průměrný čas:14,414 sekund

Výsledky benchmarku odpovědi 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

Průměrný čas:14,570 sekund

Výsledky benchmarku aktualizované odpovědi harrymca

[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

Průměrný čas:14,791 sekund

Výsledky benchmarku původní odpovědi harrymca

Vzhledem k tomu, jak pomalý byl tento příkaz, jsem srovnávací test spustil pouze jednou.

[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

Čas:1061,926 sekund


Linux
  1. Jak obnovit smazaný adresář /tmp v Linuxu

  2. Nástroje správce systému:Používání nástroje rsync ke správě zálohování, obnovy a synchronizace souborů

  3. Ubuntu – Jednoduché zálohování/obnovení systému a souborů pro Linux?

  1. Jak zálohovat a obnovit nastavení aplikací pomocí Mackupu na nově nainstalovaném systému Linux

  2. Jak zálohovat a obnovit úložiště SVN v Linuxu

  3. Jak zálohovat a obnovit databázi Postgres

  1. Jak zálohovat a obnovovat soubory pomocí Deja Dup v Linuxu

  2. Jak zálohovat a obnovovat databázi v PostgreSQL

  3. LVM Snapshot:Zálohování a obnovení oddílu LVM v Linuxu