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ć?
shell-script
mac1234
źródło
źródło
find /sourcefolder -type f -mtime -1 -exec cp -a "{}" /somefolder \;
Odpowiedzi:
Niektóre implementacje
cp
mają-t
opcję, dzięki czemu można umieścić katalog docelowy przed plikami:Zauważ, że to
-a
sugeruje--preserve
, że usunąłem to drugie.źródło
Możesz użyć
pax
do tego takich jak:Wiersz poleceń bit po bicie:
-wr
- popax
przekazaniu zarówno opcji-w
obrzędu, jak i-r
ead, kopiuje się. Prawdopodobnie również przydatne tutaj. (ale nieuwzględnione w powyższym poleceniu)-l
atrament - który tworzy twarde linki, o ile to możliwe, zamiast kopiować dane pliku.-X
do ograniczeniapax
do tego samego urządzenia źródłowego i / lub systemu plików.-s/src regex/replace/
- który modyfikuje nazwy plików w strumieniu-v
erbose - do raportowania plików pozyskanych / ukierunkowanych.-T
- w-T
pliki opcja IME wybierze do archiwum docelowego (lub po prostu skopiować, gdy używana z-wr
) w oparciu o ich/m
odification lub węzła/c
mień (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
cc
są dwie pierwsze cyfry roku (wiek),yy
dwie ostatnie cyfry roku, pierwszamm
to miesiąc (od 01 do 12),dd
to dzień miesiąca (od 01 do 31),HH
to godzina dnia (od 00 do 23),MM
jest minutą (od 00 do 59) iSS
jest sekundą (od 00 do 59). Pole minutMM
jest wymagane, a pozostałe pola są opcjonalne i należy je dodać w następującej kolejności:HH, dd, mm, yy, cc
SS
Pole 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.
-T
Można podać wiele zakresów czasowych i sprawdzanie zatrzymuje się przy pierwszym dopasowaniu.... więc
11
tam 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.źródło
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.
dzięki jeszcze raz!
źródło
Robiłem dokładnie tę samą funkcjonalność, ale potrzebowałem zachować strukturę folderów. Dlatego to, co zrobiłem, jest nieco inne.
gdzie $ dni to liczba dni $ tarpath jest tymczasową ścieżką do przechowywania tych plików. i kiedy chciałem przywrócić.
To załatwiło sprawę.
Uwaga: jeśli chcesz wykluczyć jakiś folder podczas tworzenia kopii zapasowej, możesz użyć następującego polecenia
Zaleta: 1. Zawsze miałem kopię tego, co ostatnio przywróciłem, w formacie skompresowanym.
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.
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
więcej dla rsyc z datą tutaj
źródło
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)
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:
źródło
find . -type f -newermt '17 dec 2016 20:10:00' -exec cp -t FOLDER {} +
(GNU) lubfind . -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
).