Mam folder o nazwie statistics
na serwerze Ubuntu, w którym pliki danych są regularnie przechowywane. Jak mogę zmienić nazwę statistics
folderu na backup-xx
podczas ponownego tworzenia statistics
folderu, aby był dostępny do przechowywania nowych plików?
Pliki w statistics
folderze są tworzone przez PHP file_put_contents
.
Wolę zmienić nazwę folderu, ponieważ w folderze znajduje się wiele plików statistics
.
bash
shell-script
files
rename
Googlebot
źródło
źródło
Odpowiedzi:
Spowodowałoby to zmianę nazwy istniejącego
statistics
katalogu nabackup-xx
, a jeśli się powiedzie, kontynuowałoby tworzenie nowegostatistics
katalogu.Aby uzyskać bardziej atomową operację, rozważ utworzenie katalogu
statistics-001
(lub podobnego, może przez zastąpienie001
dzisiejszą datą w odpowiednim formacie) i dowiązanie symboliczne do niego o nazwiestatistics
:Jeśli chcesz to „obrócić”, aby nowe dane trafiły do czystego katalogu, najpierw utwórz katalog, a następnie ponownie utwórz
statistics
łącze do niego:W ten sposób, każdy program zapisu do
statistics
katalogu (czyli katalog, że ten symboliczny dowiązanie) nigdy nie będzie 1 uda się go znaleźć.Jeśli potrzebujesz specjalnych uprawnień lub praw własności do katalogu, który
statistics
wskazuje, ustaw je przed (ponownym) utworzeniem łącza.1 A raczej, w ten sposób czas, w którym program byłby bez prawidłowego katalogu docelowego, został zminimalizowany tak bardzo, jak to praktycznie możliwe, przy użyciu standardowych narzędzi uniksowych.
źródło
chown --reference=backup-xx statistics ; chmod --reference=backup-xx statistics
ustawić własność i uprawnienia. Idealnie zrobiłbyś to przed zmianą nazwy, więcmkdir new ; chown ; chmod ; mv stats backup ; mv new stats
wpisz proces.ln -sf
nie jest atomowy. Określono, aby rozłączyć stare dowiązanie symboliczne, a następnie utworzyć nowe, niekoniecznie atomowe. Zamiast tego musisz utworzyć dodatkowe tymczasowe dowiązanie symboliczne i użyćrename
funkcji (mv
na przykład za pomocą polecenia), aby atomowo zastąpić stare. Zobacz moje podejście do tego tutaj: git.musl-libc.org/cgit/musl/tree/tools/…Nie ma możliwości atomowego zastąpienia katalogu innym katalogiem. Możesz przenieść stary katalog, a następnie utworzyć nowy katalog:
Ale pozostawia to niewielkie okno czasu, podczas którego
statistics
nie istnieje. Jest to problem, jeśli jakiś proces może w dowolnym momencie upuścić pliki do katalogu.Aby skutecznie atomowo zastąpić katalog, musisz użyć dowiązań symbolicznych. Utwórz katalog, którego nazwa obejmuje przedział czasowy od początku:
(lub jakkolwiek chcesz wybrać konwencję nazewnictwa katalogów). Utwórz dowiązanie symboliczne o ustalonej nazwie do bieżącej lokalizacji:
Aby zastąpić katalog, najpierw utwórz nowy katalog i nowy link symboliczny, a następnie przenieś go, aby zastąpić stary link symboliczny. Zauważ, że ani zwykły
mv
symboliczny link, ani zwykłyln -s
nie zrobią tego: utworzyłyby pozycję w katalogu docelowym. Coreutils GNU równieżln -snf
nie jest odpowiednie, ponieważ usuwa istniejące dowiązanie symboliczne przed utworzeniem nowego, co pozostawia małe okno czasowe, w którym ścieżka nie istnieje. Możesz użyć GNU coreutilsmv -T
na nowym dowiązaniu symbolicznym.źródło
busybox
„ln -sf
także nie jest atomowy, nie znam żadnej implementacji.openat()
lub CWD). Chciałbym tylko przenieść zawartość katalogu do nowego. Jest to nadal niebezpieczne w przypadku otwartych plików, ale nieco lepsze. Wątpliwe użycie,logrotate
które powinno najlepiej respektować takie problemy.symlink
Wywołanie systemowe nie zastąpi istniejącego pliku, więc niestety bezpośrednie przełączenie dowiązania symbolicznego nie jest atomowe, niestety.rename
Wywołanie systemowe zastąpi istniejący plik, ale irytująco nie ma przenośny sposób to zrobić w powłoce; jest to możliwe dzięki coreutils GNU dzięki tej-T
opcji.W ogóle nie zmieniaj nazwy katalogu. Powiedziałeś, że wolisz zmienić nazwę katalogu, ponieważ zawiera on wiele plików. Jedynym powodem, dla którego mogę o tym pomyśleć, jest to, że kopiowanie plików potrwa zbyt długo. Jednak przenoszenie (tj. Zmiana nazwy) plików jest natychmiastowe, o ile są one przenoszone do lokalizacji w tym samym systemie plików. Zakładam, że właśnie to robisz, ponieważ jeśli zmieniasz systemy plików,
mv
zajmie to tyle samo czasu,cp
bez względu na to, czy przenosi katalog, czy jego zawartość.Więc po prostu wykonaj:
Jeśli potrzebujesz również ukrytych plików, możesz:
Lub, jeśli używasz
bash
:W ten sposób katalog jest zawsze obecny, ale nadal przenosisz jego zawartość w prosty i szybki sposób.
źródło
Możesz przenieść zawartość folderu statystyk do nowo utworzonego katalogu zamiast przenosić sam folder. Jeśli przeniesiesz cały folder, musisz uruchomić inne polecenie, aby zmienić uprawnienia do katalogu.
źródło