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.


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

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.


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.


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.


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.


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


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.


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"


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.

Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.