Skrypt powłoki - pobierz wszystkie pliki zmodyfikowane po <date>

136

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.

Jonathan Leffler
źródło
14
Dobra decyzja, żeby nie robić tego w PHP.
Kredns
1
Możesz użyć dowolnego z przyzwoitych języków skryptowych powłoki, np. Python, ruby, perl bez uciekania się do php.
garaż
3
@garrow Byłoby to w rzeczywistości dość proste w PHP przy użyciu RecursiveDirctoryIterator umieszczonego w FilterIterator.
Artefacto

Odpowiedzi:

136

tak prosty jak:

find . -mtime -1 | xargs tar --no-recursion -czf myfile.tgz

gdzie find . -mtime -1wybierze wszystkie pliki w (rekurencyjnie) bieżącym katalogu zmodyfikowanym dzień wcześniej. możesz użyć ułamków, na przykład:

find . -mtime -1.5 | xargs tar --no-recursion -czf myfile.tgz
skrat
źródło
4
Zobacz odpowiedź użytkownika104848 poniżej, aby dowiedzieć się, jak radzić sobie ze spacjami w nazwach plików
Brian Henk,
8
Przekształcenie dowolnego znacznika czasu w ułamkowy, względny czas nie wydaje się ani poprawne, ani szczególnie wygodne. Poniższe rozwiązanie -newermtjest znacznie przyjemniejsze.
Bobby Jack
5
Podczas próby wyodrębnienia jakichkolwiek plików ze zmianami w strukturze z katalogami, same katalogi są oznaczane jako zmodyfikowane, co powoduje zarchiwizowanie całego folderu. Dodaj -type ftylko do wybranych plików. To zachowuje strukturę folderów, ale tworzy kopie zapasowe tylko plików ze zmianami.
Brent
1
@BrianHenk user104848 zmienili nazwę, jestem całkiem pewny, że masz na myśli tę odpowiedź z (obecnie) Jason Luther choć
icc97
4
Pytanie dotyczy wyszukiwania plików według dowolnej daty. Ta odpowiedź brzmi, jak znaleźć pliki na podstawie dowolnej liczby dni w przeszłości. Nie sądzę, aby to była akceptowana odpowiedź bez dodania kroku do konwersji daty na deltę dnia.
Mark
91

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)
  • Plus alternatywy dla czasu dostępu i czasu „zmiany” lub „utworzenia”.

Najtrudniejsze jest określenie liczby minut od czasu.

Jedna opcja warta rozważenia: użyj, touchaby utworzyć plik z wymaganym znacznikiem czasu modyfikacji; następnie użyj findz -newer.

touch -t 200901031231.43 /tmp/wotsit
find . -newer /tmp/wotsit -print
rm -f /tmp/wotsit

Wyszukuje pliki nowsze niż 2009-01-03T12: 31: 43. Oczywiście w skrypcie /tmp/wotsitbyłaby to nazwa z PID lub inną wartością, aby była unikalna; i byłby to, trapaby upewnić się, że zostanie usunięty, nawet jeśli użytkownik przerwie, i tak dalej, i tak dalej.

Jonathan Leffler
źródło
65
Zamiast tego możesz użyć, -newermt '2009-01-03T12:31:43'aby uniknąć konieczności tworzenia pliku tylko w celach informacyjnych.
Michael Mior
@MichaelMior: Interesujące - 'znajdź' na podporach MacOS X 10.7.2 -newermt(udokumentowane poniżej, -newerXYponieważ 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.
Jonathan Leffler
Ta opcja jest obecna w GNU find 4.4.2, którego używam w moim systemie.
Michael Mior
2
Zauważ również, że GNU find obsługuje również czasy względne, tj. -newermt '-2 weeks'.
Cybolic
1
-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.html
antoine
35

Możesz to zrobić bezpośrednio za pomocą smoły, a nawet lepiej:

tar -N '2014-02-01 18:00:00' -jcvf archive.tar.bz2 files

To instruuje tar, aby kompresował pliki nowsze niż 1 stycznia 2014 o 18:00:00.

linux_newbie
źródło
9
Huh ... Używam Uniksa od 1984 roku i nigdy o tym nie wiedziałem. Zawsze trzeba się czegoś nauczyć.
John
Implementacje tartego są obsługiwane tylko przez OS X i FreeBSD, --newerco jest długą opcją -Nw GNU tar.
nisetama
To jest niesamowite ... Mogłem go zmusić do pracy tylko z bzipem, bez użycia -xcvf i rozszerzenia gz ... ale nie jestem ekspertem.
phil
17

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”.

find . -mtime -7 -print0 | xargs -0 tar -cjf /foo/archive.tar.bz2

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:

find . -mtime -7 -print0 | xargs -0 tar -rf /foo/archive.tar

Nie możesz zaktualizować spakowanego archiwum tar za pomocą tar, więc musiałbyś w drugim kroku wykonać bzip2 lub gzip.

Jason Luther
źródło
1
Jeśli chodzi o drugi punkt, możesz użyć polecenia tar z włączoną funkcją gzip, takiego jak opcja -z tar w Gnu, aby zaktualizować spakowane archiwa.
Suncat2000,
Lub dodaj opcję `` j '', aby użyć bzip w ostatnich tarsach GNU
hd1
3
Jak powiedziałem powyżej w odpowiedzi Jonathana, spowoduje to pobranie folderów ze zmianami powodującymi importowanie wszystkich ich plików. Dodaj -type ftylko do wybranych plików. To zachowuje strukturę folderów, ale tworzy kopie zapasowe tylko plików ze zmianami / dodanymi ostatnio.
Brent
12

Powinno to pokazać wszystkie pliki zmodyfikowane w ciągu ostatnich 7 dni.

find . -type f -mtime -7 -print

Przepuść to do tar / zip i powinieneś być dobry.

Chris Doggett
źródło
3

dobrze pod linuxem spróbuj przeczytać stronę podręcznika dla polecenia find

man find

coś takiego powinno

 find . -type f -mtime -7 -print -exec cat {} \; | tar cf - | gzip -9

i masz to

Luixv
źródło
3

Możesz uzyskać listę plików ostatnio zmodyfikowanych później niż x dni temu za pomocą:

find . -mtime -x

Następnie wystarczy tar i pliki zip w wynikowej liście, np:

tar czvf mytarfile.tgz `find . -mtime -30`

dla wszystkich plików zmodyfikowanych w ciągu ostatniego miesiąca.

mouviciel
źródło
3
„-mtime x” odpowiada plikom zmodyfikowanym dokładnie „x” dni temu, użyj „-mtime -x”, aby dopasować pliki zmodyfikowane mniej niż „x” dni temu.
Lance Richardson
3

Zrobiłbym po prostu następujące czynności, aby wykonać kopię zapasową wszystkich nowych plików sprzed 7 dni

tar --newer $(date -d'7 days ago' +"%d-%b") -zcf thisweek.tgz .

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"

Michel
źródło
2

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)

PATH_SRC="/home/celvas/Documents/Imp_Task/"
PATH_DST="/home/celvas/Downloads/zeeshan/"

cd $PATH_SRC
TODAY=$(date  -d "$(date +%F)" +%s)
TODAY_TIME=$(date -d "$(date +%T)" +%s)


for f in `ls`;
do
#       echo "File -> $f"
        MOD_DATE=$(stat -c %y "$f")
        MOD_DATE=${MOD_DATE% *}
#       echo MOD_DATE: $MOD_DATE
        MOD_DATE1=$(date -d "$MOD_DATE" +%s)
#       echo MOD_DATE: $MOD_DATE

DIFF_IN_DATE=$[ $MOD_DATE1 - $TODAY ]
DIFF_IN_DATE1=$[ $MOD_DATE1 - $TODAY_TIME ]
#echo DIFF: $DIFF_IN_DATE
#echo DIFF1: $DIFF_IN_DATE1
if [[ ($DIFF_IN_DATE -ge -120) && ($DIFF_IN_DATE1 -le 120) && (DIFF_IN_DATE1 -ge -120) ]]
then
echo File lies in Next Hour = $f
echo MOD_DATE: $MOD_DATE

#mv $PATH_SRC/$f  $PATH_DST/$f
fi
done

Na przykład chcesz pliki posiadające datę modyfikacji przed dana data tylko może zmienić 120się 0w $DIFF_IN_DATEparametrze odrzucając warunki $DIFF_IN_DATE1parametru.

Podobnie, jeśli chcesz, aby pliki miały datę modyfikacji 1 godzinę przed i po podanej dacie, po prostu zamień 120na 3600in if CONDITION.

Zeeshan Ali
źródło