Zakładając, że korzystanie chmod
z pakietu GNU coreutils na Ubuntu 12.10.
chmod 775 . -R
wykonuje fchmodat
wywołanie systemowe dla każdego znalezionego pliku, niezależnie od tego, czy uprawnienia wymagają zmiany, czy nie. Potwierdziłem to zarówno poprzez sprawdzenie kodu, jak i użycie strace chmod 775 . -R
(fragmentu poniżej) do wyświetlenia faktycznego zachowania.
newfstatat(4, "d", {st_mode=S_IFREG|0666, st_size=0, ...}, AT_SYMLINK_NOFOLLOW) = 0
fchmodat(4, "d", 0775) = 0
newfstatat(4, "c", {st_mode=S_IFREG|0666, st_size=0, ...}, AT_SYMLINK_NOFOLLOW) = 0
fchmodat(4, "c", 0775) = 0
newfstatat(4, "a", {st_mode=S_IFREG|0666, st_size=0, ...}, AT_SYMLINK_NOFOLLOW) = 0
fchmodat(4, "a", 0775) = 0
newfstatat(4, "b", {st_mode=S_IFREG|0666, st_size=0, ...}, AT_SYMLINK_NOFOLLOW) = 0
fchmodat(4, "b", 0775) = 0
Uruchomienie fchmodat
każdego pliku ma kilka wad
- Dodatkowe wywołanie systemowe prawdopodobnie stanie się znaczące, jeśli zmieni się duża liczba plików.
find
/ xargs
/ chmod
Metoda wspomniano przez innych będzie prawdopodobnie szybciej przez zmianę tylko pliki, które trzeba wymieniać.
- Wezwanie do
fchmodat
zmiany modyfikacji statusu pliku (ctime) każdego pliku. Spowoduje to, że każdy plik / i-węzeł zmieni się za każdym razem i prawdopodobnie spowoduje nadmierne zapisy na dysku. Może być możliwe użycie opcji montowania, aby zatrzymać nadmiar zapisu.
Prosty eksperyment pokazuje zmiany czasu dla prostej chmod
auser@duncow:/tmp/blah.test$ ls -lc
total 0
-rwxrwxr-x 1 laptop laptop 0 Jun 18 18:17 a
-rwxrwxr-x 1 laptop laptop 0 Jun 18 18:17 b
-rwxrwxr-x 1 laptop laptop 0 Jun 18 18:17 c
-rwxrwxr-x 1 laptop laptop 0 Jun 18 18:17 d
auser@duncow:/tmp/blah.test$ chmod 775 . -R
auser@duncow:/tmp/blah.test$ ls -lc
total 0
-rwxrwxr-x 1 laptop laptop 0 Jun 18 18:25 a
-rwxrwxr-x 1 laptop laptop 0 Jun 18 18:25 b
-rwxrwxr-x 1 laptop laptop 0 Jun 18 18:25 c
-rwxrwxr-x 1 laptop laptop 0 Jun 18 18:25 d
Ale to się nie zmienia przez find
/ xargs
/ chmod
kilka minut później
auser@duncow:/tmp/blah.test$ date
Tue Jun 18 18:27:27 BST 2013
auser@duncow:/tmp/blah.test$ find . ! -perm 775 -print0 | xargs -0 -I {} chmod 775 {}
auser@duncow:/tmp/blah.test$ ls -lc
total 0
-rwxrwxr-x 1 laptop laptop 0 Jun 18 18:25 a
-rwxrwxr-x 1 laptop laptop 0 Jun 18 18:25 b
-rwxrwxr-x 1 laptop laptop 0 Jun 18 18:25 c
-rwxrwxr-x 1 laptop laptop 0 Jun 18 18:25 d
Zawsze miałbym tendencję do używania wersji find
/ xargs
/, chmod
ponieważ find daje większą kontrolę nad wyborem rzeczy.