Wolałbym nie robić tego w PHP, więc mam nadzieję, że ktoś przyzwoity ze skryptów powłoki może pomóc.
Potrzebuję skryptu, który uruchamia katalog rekurencyjnie i znajduje wszystkie pliki z datą ostatniej modyfikacji, która jest większa niż jakaś data. Następnie spakuje i spakuje plik (i), zachowując informacje o ścieżce.
Odpowiedzi:
tak prosty jak:
gdzie
find . -mtime -1
wybierze wszystkie pliki w (rekurencyjnie) bieżącym katalogu zmodyfikowanym dzień wcześniej. możesz użyć ułamków, na przykład:źródło
-newermt
jest znacznie przyjemniejsze.-type f
tylko do wybranych plików. To zachowuje strukturę folderów, ale tworzy kopie zapasowe tylko plików ze zmianami.Jeśli masz GNU
find
, to jest legion odpowiednich opcji. Jedynym problemem jest to, że interfejs do nich jest mniej niż gwiezdny:-mmin n
(czas modyfikacji w minutach)-mtime n
(czas modyfikacji w dniach)-newer file
(czas modyfikacji nowszy niż czas modyfikacji pliku)-daystart
(dostosuj czas rozpoczęcia od aktualnego czasu do początku dnia)Najtrudniejsze jest określenie liczby minut od czasu.
Jedna opcja warta rozważenia: użyj,
touch
aby utworzyć plik z wymaganym znacznikiem czasu modyfikacji; następnie użyjfind
z-newer
.Wyszukuje pliki nowsze niż 2009-01-03T12: 31: 43. Oczywiście w skrypcie
/tmp/wotsit
byłaby to nazwa z PID lub inną wartością, aby była unikalna; i byłby to,trap
aby upewnić się, że zostanie usunięty, nawet jeśli użytkownik przerwie, i tak dalej, i tak dalej.źródło
-newermt '2009-01-03T12:31:43'
aby uniknąć konieczności tworzenia pliku tylko w celach informacyjnych.-newermt
(udokumentowane poniżej,-newerXY
ponieważ istnieje wiele opcji; X = m, Y = t w tym przypadku). Znalezione GNU w (prawie archaicznych) systemach Linux, których używam, nie obsługuje tych opcji, więc jest to stosunkowo nowe pojawienie się. Dzięki za ostrzeżenie.-newermt '-2 weeks'
.-newermt '2009-01-03T12:31:43'
wygląda niesamowicie, ale niestety wydaje się, że interpretuje wszystko w niewłaściwej strefie czasowej: lists.gnu.org/archive/html/bug-findutils/2012-12/msg00009.htmlMożesz to zrobić bezpośrednio za pomocą smoły, a nawet lepiej:
To instruuje tar, aby kompresował pliki nowsze niż 1 stycznia 2014 o 18:00:00.
źródło
tar
tego są obsługiwane tylko przez OS X i FreeBSD,--newer
co jest długą opcją-N
w GNUtar
.To zadziała w przypadku niektórych plików. Chcesz dołączyć „-print0” i „xargs -0” na wypadek, gdyby którakolwiek ze ścieżek zawierała spacje. Ten przykład szuka plików zmodyfikowanych w ciągu ostatnich 7 dni. Aby znaleźć te zmodyfikowane przed ostatnimi 7 dniami, użyj „+7”.
Jak ostrzega ta strona , xargs może spowodować wielokrotne wykonanie polecenia tar, jeśli jest dużo argumentów, a flaga „-c” może powodować problemy. W takim przypadku chciałbyś tego:
Nie możesz zaktualizować spakowanego archiwum tar za pomocą tar, więc musiałbyś w drugim kroku wykonać bzip2 lub gzip.
źródło
-type f
tylko do wybranych plików. To zachowuje strukturę folderów, ale tworzy kopie zapasowe tylko plików ze zmianami / dodanymi ostatnio.Powinno to pokazać wszystkie pliki zmodyfikowane w ciągu ostatnich 7 dni.
Przepuść to do tar / zip i powinieneś być dobry.
źródło
dobrze pod linuxem spróbuj przeczytać stronę podręcznika dla polecenia find
coś takiego powinno
i masz to
źródło
Możesz uzyskać listę plików ostatnio zmodyfikowanych później niż x dni temu za pomocą:
Następnie wystarczy tar i pliki zip w wynikowej liście, np:
dla wszystkich plików zmodyfikowanych w ciągu ostatniego miesiąca.
źródło
Zrobiłbym po prostu następujące czynności, aby wykonać kopię zapasową wszystkich nowych plików sprzed 7 dni
pamiętaj, że możesz również zastąpić „7 dni temu” czymkolwiek, co odpowiada Twoim potrzebom
Może być :
date -d'yesterday' +"%d-%b"
Lub nawet :
date -d'first Sunday last month' +"%d-%b"
źródło
Ten skrypt znajdzie pliki mające datę modyfikacji dwie minuty przed i po podanej dacie (i możesz zmienić wartości w warunkach zgodnie z wymaganiami)
Na przykład chcesz pliki posiadające datę modyfikacji przed dana data tylko może zmienić
120
się0
w$DIFF_IN_DATE
parametrze odrzucając warunki$DIFF_IN_DATE1
parametru.Podobnie, jeśli chcesz, aby pliki miały datę modyfikacji 1 godzinę przed i po podanej dacie, po prostu zamień
120
na3600
inif CONDITION
.źródło