Ponieważ przeinstalowywałem ostatnio system i zmieniły mi się uidy użytkowników (czasami lepiej trzymać userów w ldapie 😉 ), musiałem zaktualizować UIDy plików ze starych na nowe. Żeby to zrobić można skorzystać znaleźć wszystkie pliki i na każdym wykonać chowna (find . -uid 1000 -exec chown {} \;) – ale to będzie strasznie wolne (wykonanie aplikacji dla każdego pliku)
Zamiast tego, można wywołać chowna raz dla wszystkich plików, podając jako argumenty wszystkie pliki. Żeby to zrobić można skorzystać z „xargs”. Problem pojawi się, gdy w nazwach plików są białe znaki (np. spacje). xargs wtedy potraktuje taką ścieżkę jako dwa argumenty, (np. „/mnt/moj plik” stanie się” /mnt/moj” „plik”) i zmiana się nie powiedzie 😉 )
Można natomiast odseparować te arugmenty za pomocą „null character”. Argument „-0” (zero) informuje xargs, że argumenty nie są oddzielone białymi znakami, a „null characterem”. Trzeba jeszcze tylko finda poinformować, żeby w ten sposób oddzielał wyniki. Argument „-print0” służy do tego.
find . -uid 1000 -print0 | xargs -0 chown nowy-user
a nawet lepiej, jeśli mamy symlinki, żeby zmienić właściciela symlinku, a nie pliku docelowego:
find . -uid 1000 -print0 | xargs -0 chown -h nowy-user
Dodaj komentarz