Muszę przenosić pliki na podstawie roku. Użyłem find
polecenia
find /media/WD/backup/osool/olddata/ -mtime +470 -exec ls -lrth {} \;|sort -k6
ale aby to polecenie mogło zostać pomyślnie wykonane, muszę dokładnie wiedzieć, że mtime
470 to tylko przypuszczenie. Znaczy, czy mogę podać rok 2012, daje mi pliki związane tylko z rokiem 2012.
Potrzebuję porady, jak to zrobić
Znajdź pliki na podstawie roku, np. 2012 i przenieś je do innego katalogu.
OS release 5.2
FIND version
GNU find version 4.2.27
Features enabled: D_TYPE O_NOFOLLOW(enabled) LEAF_OPTIMISATION SELINUX
-exec ls ... \;
zamiast tego-exec ... +
? Czy twoje znalezisko jest na to za stare? W takim przypadkufind ... -print0 | xargs -0 ls...
byłoby znacznie szybciej.Odpowiedzi:
Chcesz użyć
-newermt
opcji dlafind
:aby uzyskać wszystkie pliki z czasem modyfikacji w 2012 roku.
Jeśli wyszukiwanie nie obsługuje
-newermt
, możesz również wykonać następujące czynności, aby zapobiec korzystaniu z obliczeń przesunięcia:źródło
find
(znalazłem wersję 4.4.2)-exec ls
nie ma żadnego sensu.źródło
-exec ls -l
ma więcej sensu, a nawet więcej podczas testowania.find
może wydrukować wszystko, cols
może. OK, z jednym wyjątkiem: ucieczka / cytowanie nieprzyjemnych znaków. Ale ogólnie wynikifind
można sortować bezpośrednio. Bezużyteczne wezwania ls nie przyspieszają.-print
lub ewentualnie-ls
) podczas testowania. Zaletą użycia-exec ls {}
jest to, że już wykonuje coś zewnętrznego do znalezienia . Więc w momencie przełączenia zls
namv
rzeczywiste zmiany są minimalne.Według strony podręcznika argumentem -mtime jest liczba dni, których szukasz. Możesz użyć,
date +%j
aby znaleźć liczbę dni od 1 stycznia bieżącego roku.źródło
-daystart
opcji-mtime
. W przeciwnym razie będziesz mieć problemy z plikami na początku i na końcu roku, niezależnie od tego, w którą stronę się skręcisz, chyba że uruchomisz to dokładnie o północy. Możesz dokonać przesunięcia dokładniej-mmin
niż za pomocą,-mtime
jeśli możesz łatwo znaleźć liczbę minut od nowego roku. Ale ten sam problem istnieje z tym, co z-mtime
, tylko dla mniejszej liczby plików (tych o minutę około północy nowego roku).find -mtime $("date -+%j")
prawdopodobnie nie da OP tego, co zamierzają. Pozostawiam to potomności, ponieważ wydaje się, że może to być ślepa plamka dla ludzi, w którą można wpaść.Możesz spróbować użyć kombinacji z komendami
stat
i / lubdate
jak w następujących linijkach:BSD / Mac OS X:
Linux:
W obu przypadkach podejście polega na użyciu
date
polecenia do wyodrębnienia roku z czasu ostatniej modyfikacji każdego pliku, a następnie do utworzenia ścieżki z tym rokiem. Poleceniemkdir -p
utworzy tę ścieżkę, jeśli jeszcze nie istnieje. Oczywiście możesz użyć innychfind
opcji, aby zawęzić wyszukiwanie.źródło
Jeśli zrobisz to z katalogu roboczego, możesz to zrobić w zamian:
Upraszcza to znacznie i nie powoduje nakładania się. Ale zakłada również, że te pliki są starsze niż 6 miesięcy i że
ls
wydrukuje rok zamiast dokładnej godziny.W przypadku plików starszych niż 6 miesięcy musisz po prostu zastąpić to:
lub coś podobnego, w zależności od miesiąca. Jeśli chcesz utworzyć listę miesięcy, dla których chcesz przenieść pliki (lub jeśli chcesz utworzyć listę na lata):
źródło