Jak mogę rekurencyjnie wyświetlić listę wszystkich plików, które zostały zmienione między 22.12.2011 a 24.12.2011?
files
recursive
timestamps
Zacisk
źródło
źródło
Odpowiedzi:
Ogólnie rzecz biorąc, jeśli szukasz plików w katalogu i jego podkatalogach rekurencyjnie, użyj
find
.Najłatwiejszym sposobem określenia zakresu dat
find
jest utworzenie plików na granicach zakresu i użycie-newer
predykatu.źródło
-newer
?-newer
nie jest zanegowany, drugi jest. „Znajdź pliki, które są nowsze niż,start
ale nie nowsze niżstop
”.start
istop
.Korzystając z rozwiązania Gillesa i po przeczytaniu mężczyzny znajdź (1) , znalazłem prostsze rozwiązanie. Najlepszą opcją jest -newerXY. Można użyć flag m i t.
Więc rozwiązaniem jest
Dolna granica włącznie, a górna granica jest wyłączna, więc dodałem do niej 1 dzień! I to jest rekurencyjne. Działa dobrze na find v4.5.9.
źródło
find -newermt 20150212 \! -newermt 20150213 | xargs grep 'keyword' -m 50 -l
(-m 50
= szukaj w pierwszych 50 wierszach).-exec ... +
wfind(1)
jak:find -newermt 20150212 \! -newermt 20150213 -exec grep keyword -m 50 -l {} +
. Robi to samo, ale taniej.find 4.7.0-git
).Oprócz podanych już odpowiedzi pamiętaj, że możesz bezpośrednio określić swoje daty:
lub
jeśli dodatkowo chcesz określić czas.
źródło
Zakładając, że nie potrzebujesz precyzji do sekund, powinno to działać.
EDYCJA: Zmieniono
cmin
nammin
po komentarzu @ Eelvex. EDYCJA: „\!” brakującyźródło
-cmin
to „zmiana stanu”,-mmin
to „zmiana danych”. Prawdopodobnie chcesz-mmin
find
może zająć sformatowaną datę / godzinę w formacie ISO, więc na przykład dla serwera na UTC można określić przesunięcie liczby godzin od miejsca, w którym się znajdujesz. To również wymaga dodania dnia, ponieważ również porównujesz czas:źródło
Pamiętaj, że pytanie oznaczone jako zduplikowane i dlatego nie ma możliwości bezpośredniej odpowiedzi na to pytanie, dlatego piszę tutaj. Ta odpowiedź służy udzieleniu odpowiedzi na pytanie „trzeba przenieść pliki do innego folderu na podstawie daty utworzenia [duplikat]”
Odpowiedzi są rozsądne, ale były pewne ograniczenia dotyczące wyłącznie polecenia znajdowania. Napisałem ten skrypt powłoki, aby przejść przez katalog z tak wieloma plikami, że system plików dławił się metadanych, próbując wykonać ls. Dodatkowo, niektóre systemy * nix nie wyświetlają zbyt wielu argumentów przy uruchamianiu ls.
Polecenie find jest bardzo wydajne i zacząłem od wymienionych metod, ale miałem tyle lat danych w tym katalogu, że musiałem wielokrotnie przesyłać wszystkie pliki. Powoduje to wiele niepotrzebnych przejść przez każdy plik. Próbowałem robić jeden ekran rocznie i uruchamiać wiele wyników, ale spowodowało to wiele błędów przy każdym znalezieniu, a pliki ginęłyby, gdy jedno z nich przeniosło je.
Mój skrypt powłoki przenosi plik do katalogu docelowego z 4-cyfrowym rokiem i 2-cyfrowym miesiącem. Można go z łatwością rozszerzyć do dwucyfrowego dnia, usuwając komentarz z kilku wierszy i komentując ich odpowiedniki. Uważam, że jest bardziej wydajny, ponieważ wykonywał ruchy w jednym przejściu find, więc wiele poleceń find i przejść przez katalog jest niepotrzebnych.
Po zapisaniu i utworzeniu pliku wykonywalnego możesz wywołać ten skrypt za pomocą polecenia find, jak poniżej.
Nie musisz się martwić ustawieniem opcji newermt dla find, ponieważ wszystko, co zapewnia, to pojedyncze wykonanie dla każdego znalezionego pliku, a skrypt podejmuje wszystkie decyzje.
Należy pamiętać, że jeśli nie wybierzesz -type, spowoduje to przenoszenie katalogów i prawdopodobnie spowoduje problemy. Możesz także użyć -type d, jeśli chcesz przenieść tylko katalogi. Brak ustawienia tego typu prawie na pewno spowoduje niepożądane zachowanie.
Pamiętaj, że ten skrypt został dostosowany do moich potrzeb. Możesz po prostu użyć mojej konstrukcji jako inspiracji do lepszego dopasowania do skryptu potrzeb. Dziękuję Ci!
Rozważania: Wydajność polecenia może być WIELKIE poprawiona, umożliwiając nieograniczoną liczbę argumentów przechodzących przez skrypt. Jest to w rzeczywistości stosunkowo łatwe, jeśli pominiesz zmienną $ @. Rozszerzenie tej funkcjonalności pozwoliłoby nam na przykład użyć funkcji find -exec + lub dźwigni xargs. Mogę to szybko wdrożyć i poprawić własną odpowiedź, ale to dopiero początek.
Ponieważ była to krótka sesja skryptowa, prawdopodobnie można wprowadzić wiele ulepszeń. Powodzenia!
źródło