Znajdź pliki nowsze niż jeden dzień i skopiuj

12

Pracuję nad skryptem, który skopiuje TYLKO pliki, które zostały utworzone w ciągu ostatniego dnia wolnego do innego folderu. Problemem jest skrypt, który mam kopiuje wszystkie pliki w katalogu źródłowym, a nie tylko pliki starsze niż jeden dzień.

Oto co mam:

find . -mtime -1 -exec cp --preserve --parents -a "{}" /somefolder \;

Powyższy kod kopiuje wszystkie pliki w katalogu źródłowym. Jeśli usunę wszystkie argumenty dla „cp”, to zadziała:

find . -mtime -1 -exec cp "{}" /somefolder \;

Powyższy kod kopiuje tylko najnowsze pliki, jak chcę, ale muszę zachować atrybuty za pomocą argumentów cp.

Próbowałem również zmiennych i dla pętli myślących może problemem była opcja -exec:

files="$(find -mtime -1)"
for file in "$files"
do
cp --parents --preserve -a file /somefolder

Jednak powyższe dla pętli powoduje ten sam problem, wszystkie pliki są kopiowane. Jeśli odbieram pliki $, wyświetlane są tylko pliki, których potrzebuję.

Jak mogę to uruchomić?

mac1234
źródło
1
Ok, myślę, że mam go działającego przy użyciu:find /sourcefolder -type f -mtime -1 -exec cp -a "{}" /somefolder \;
mac1234
Czy rsync nie byłby lepszym narzędziem do tego zadania zamiast cp? rsync -a źródło przeznaczenia
Darryl

Odpowiedzi:

9

Niektóre implementacje cpmają -topcję, dzięki czemu można umieścić katalog docelowy przed plikami:

find . -mtime -1 -exec cp -a --parents -t /somefolder "{}" \+

Zauważ, że to -asugeruje --preserve, że usunąłem to drugie.

Glenn Jackman
źródło
To także kopiuje foldery ze starymi plikami ...?
Luis A. Florit,
3

Możesz użyć paxdo tego takich jak:

pax -wrT "11$(date +%H%M)," . /destination/folder

Wiersz poleceń bit po bicie:

  • -wr- po paxprzekazaniu zarówno opcji -wobrzędu, jak i -read, kopiuje się. Prawdopodobnie również przydatne tutaj. (ale nieuwzględnione w powyższym poleceniu)

    • -latrament - który tworzy twarde linki, o ile to możliwe, zamiast kopiować dane pliku.

    • -Xdo ograniczenia paxdo tego samego urządzenia źródłowego i / lub systemu plików.

    • -s/src regex/replace/ - który modyfikuje nazwy plików w strumieniu

    • -verbose - do raportowania plików pozyskanych / ukierunkowanych.

  • -T- w -Tpliki opcja IME wybierze do archiwum docelowego (lub po prostu skopiować, gdy używana z -wr) w oparciu o ich /modification lub węzła /cmień (lub obu) razy. Domyślnie mod czas. Od...

człowiek pax

  • ... Porównywanie czasu przy użyciu obu czasów plików jest przydatne, gdy pax jest używany do tworzenia archiwum przyrostowego opartego na czasie (archiwizowane będą tylko pliki, które zostały zmienione w określonym przedziale czasowym).

  • Zakres czasu składa się z sześciu różnych pól, a każde pole musi zawierać dwie cyfry. Format to:

    [[[[[cc]yy]mm]dd]HH]MM[.SS]

  • Gdzie ccsą dwie pierwsze cyfry roku (wiek), yydwie ostatnie cyfry roku, pierwsza mmto miesiąc (od 01 do 12), ddto dzień miesiąca (od 01 do 31), HHto godzina dnia (od 00 do 23), MMjest minutą (od 00 do 59) i SSjest sekundą (od 00 do 59). Pole minut MMjest wymagane, a pozostałe pola są opcjonalne i należy je dodać w następującej kolejności:

    HH, dd, mm, yy, cc

  • SSPole może być dodana niezależnie od innych dziedzin. Przedziały czasowe odnoszą się do bieżącego czasu, więc ...

    -T 1234/cm

  • ... wybrałby wszystkie pliki ze zmianą lub czasem zmiany i-węzła o godzinie 12:34 dzisiaj lub później.

  • -TMożna podać wiele zakresów czasowych i sprawdzanie zatrzymuje się przy pierwszym dopasowaniu.

... więc 11tam w moim przykładzie polecenie odnosi się do dnia dzisiejszego - jest o jeden mniej niż dzisiejsza data - która jest dwunasta - a reszta to tylko standardowy "$(date)"format, po którym następuje przecinek.

... z wyjątkiem - i ostatnia rzecz warta wspomnienia - używam bezwzględnej ścieżki do katalogu docelowego - i ty też powinieneś, jeśli to zrobisz. Dokumenty odwołują się do nieokreślonego zachowania względnych ścieżek docelowych - i za pierwszym razem, gdy próbowałem użyć pax, przeklinałem pod nosem przez godzinę w pomieszaniu ze wszystkimi dziwnymi wynikami, dopóki nie użyłem ścieżki absolutnej.

mikeserv
źródło
2

Dziękuję wszystkim za pomoc, sprawiło, że zadziałało dzięki kombinacji twoich sugestii:

poszedł z poniższym kodem i działa idealnie.

find /sourcefolder -type f -mtime -1 -exec cp -a "{}" /somefolder \;

dzięki jeszcze raz!

mac1234
źródło
2

Robiłem dokładnie tę samą funkcjonalność, ale potrzebowałem zachować strukturę folderów. Dlatego to, co zrobiłem, jest nieco inne.

cd sourcedir
find . -type f -mtime -$days -print0 | tar -czvf ${tarpath}/testtar.tar.gz --null -T -

gdzie $ dni to liczba dni $ tarpath jest tymczasową ścieżką do przechowywania tych plików. i kiedy chciałem przywrócić.

cd $destdir
tar -xvzf ${tarpath}/testtar.tar.gz

To załatwiło sprawę.

Uwaga: jeśli chcesz wykluczyć jakiś folder podczas tworzenia kopii zapasowej, możesz użyć następującego polecenia

find . -type f -mtime -$days ! -path '*/FolderToavoidSearch/*' -print0 | tar -czvf ${tarpath}/testtar.tar.gz --null -T -

Zaleta: 1. Zawsze miałem kopię tego, co ostatnio przywróciłem, w formacie skompresowanym.

  1. również mam przerwę między przywracaniem, gdzie mogę przejść i sprawdzić, jakie są te pliki, a jeśli wszystko jest w porządku, kontynuuj skrypt.

  2. Zachowuje strukturę folderów, dlatego właśnie zastąpił zmodyfikowane pliki z katalogu źródłowego do katalogu docelowego

Uwaga: Z drugiej strony, jeśli wymaganie nie jest ograniczone w czasie, użyłbym rsync

rsync -avz --exclude 'FolderToavoidSearch' --backup --backup-dir="/backup/dir/test/backup_$(date +\%Y-\%m-\%d)" /source/dir/ /dest/dir/

więcej dla rsyc z datą tutaj

Amol Patil
źródło
1

Można również wybrać dokładną datę i godzinę inną niż powrót do określonej liczby dni

(Działa to dobrze tylko wtedy, gdy w nazwach plików nie ma spacji, tabulatorów ani symboli wieloznacznych)

cp `find . -type f -newermt '17 dec 2016 20:10:00'` FOLDER

Powyżej kopiuje wszystkie pliki z katalogu, które zostały utworzone po 17 grudnia 2016 20:10:00 do FOLDERU (1 dzień wcześniej dzisiaj :)

Uważaj na symbol polecenia find, to NIE jest to: „to jest, backtick:„ wybór daty jest z tym: ”

W przypadku plików ze spacjami, tabulatorami, znakami nowej linii lub symbolami wieloznacznymi w ich nazwach możesz użyć jednego z rozwiązań Stéphane Chazelas, po pierwsze dla GNU, po drugie dla GNU lub niektórych BSD:

find . -type f -newermt '17 dec 2016 20:10:00' -exec cp -t FOLDER {} + 
find . -type f -newermt '17 dec 2016 20:10:00' -exec sh -c 'cp "$@" FOLDER' sh {} +
FatihSarigol
źródło
Dzięki Stephane, może dlatego nie mogłem znaleźć tego w żadnym poście, choć w moim przypadku działało to jak urok. kiedy to zrobisz, znajdź tylko. -type f -newermt '17 gru 2016 20:10:00 '
FatihSarigol
... drukuje pliki utworzone po tym czasie, nie jestem pewien, jaki problem może sam spowodować. następnie po prostu używam strzałek wstecznych, aby wybrać pliki do skopiowania. na zdrowie
FatihSarigol,
Wydaje mi się, że udostępniony przez ciebie wpis dotyczy „Pętli”, czy mój kod zapętla wynik wyszukiwania? czy to po prostu wybranie wyniku znalezienia do użycia przez kopiowanie? (Przepraszam za 3 komentarze, najwyraźniej nie mogę jeszcze edytować swoich komentarzy
FatihSarigol,
1
Użyj find . -type f -newermt '17 dec 2016 20:10:00' -exec cp -t FOLDER {} +(GNU) lub find . -type f -newermt '17 dec 2016 20:10:00' -exec sh -c 'cp "$@" FOLDER' sh {} +(GNU lub niektóre BSD (tutaj ograniczeniem jest przenośność wrt -newermt).
Stéphane Chazelas,