Jak używać „znajdź”, aby wyszukiwać pliki utworzone w określonym dniu? [Zamknięte]


254

Jak korzystać z polecenia UNIX, findaby wyszukiwać pliki utworzone w określonym dniu?


8
Wygląda na to, że dozwolone są pytania dotyczące skryptów bash.
Alan

@MichaelScheper: Nie wiem nawet, od czego zacząć ten komentarz.
Wyścigi lekkości na orbicie

1
@Notinlist: Oto odpowiedź: meta.stackexchange.com/questions/10249/… Niestety okazuje się, że upłynął limit czasu. Szkoda, ponieważ wciąż pojawiają się tutaj wyszukiwania internetowe, a zaakceptowana odpowiedź była pomocna dla wielu osób.
Michael Scheper,

@MichaelScheper: Jeśli możesz znaleźć opcję głosowania na migrację do unix.stackexchange.com, to zdecydowanie wskaż mi to. Ponieważ nie masz przedstawiciela, aby zobaczyć zamknięte okno dialogowe, dam ci podpowiedź: nie ma jednego. Rozważ bycie mniej wojowniczym, gdy nie masz pojęcia, o czym mówisz. Dziękuję za uwagę.
Wyścigi lekkości na orbicie

5
@LightnessRacesinOrbit: Przepraszam za to, że przedstawiłem się jako „wojowniczy”. Nie mogę edytować moich komentarzy, ale czy w przyszłości mogę pochwalić pytanie, które cię obraziło? Muszę powiedzieć, że czuję się trochę ślepy, nawet po tym, jak podałem swój poprzedni komentarz, mając wątpliwości. Właściwie starałem się być bardziej konstruktywny niż dodawanie kolejnego „ja też”, patrząc, jak działa migracja: meta.stackexchange.com/a/10250/249555 Być może limit 60 dni ukrywa tę opcję? Przepraszam za bum steer. Jeszcze raz dziękuję - szczerze - za poświęcony czas i uwagę.
Michael Scheper,

Odpowiedzi:


323

Jak zauważył Max, nie możesz, ale sprawdzanie plików zmodyfikowanych lub dostępnych nie jest wcale takie trudne. Napisałem samouczek na ten temat, jeszcze dzisiaj. Istotą jest użycie -newerXYi ! -newerXY:

Przykład: Aby znaleźć wszystkie pliki zmodyfikowane 7 czerwca 2007:

$ find . -type f -newermt 2007-06-07 ! -newermt 2007-06-08

Aby znaleźć wszystkie pliki dostępne 29 września 2008 r .:

$ find . -type f -newerat 2008-09-29 ! -newerat 2008-09-30

Lub pliki, których uprawnienia zostały zmienione tego samego dnia:

$ find . -type f -newerct 2008-09-29 ! -newerct 2008-09-30

Jeśli nie zmienisz uprawnień do pliku, „c” zwykle odpowiada dacie utworzenia.


7
Moja wersja find (GNU 4.2.32) nie obsługuje predykatów -newerXY. Czy potrzebna jest konkretna minimalna wersja? A może jest to przypadek kompilacji find ze specjalnym przełącznikiem konfiguracji?
yukondude

1
@yukondude: Masz rację. Wersja find, którą mam lokalnie - GNU 4.4.0 - ma ją, podczas gdy 4.1.20, którą mam na Dreamhost, nie. Jednak kludge z tworzeniem dwóch plików powinien działać w każdym z nich.
Arve,

1
W niektórych systemach (FreeBSD, OS / X ...) -newerBtbędzie pasować do czasu urodzenia (utworzenia) pliku .
Stephane Chazelas

3
Zauważ, że -newerxtjest dostępny na FreeBSD od 2001 roku (gdzie po raz pierwszy został udostępniony jako łatka w 1998 roku), kilka innych BSD i GNU znajduje (od 4.3.3 w 2007), w oparciu o HP / UX, który wprowadził -newerXY(ale gdzie Y == t nie jest obsługiwane).
Stephane Chazelas

Używając: find (GNU findutils) 4.4.0, ta składnia nie działa na SUSE ext3, jeśli ma wyświetlać listę plików / m mtime w tym dniu, nic nie zwraca
niken

68

find location -ctime time_period

Przykłady okresu_czasu:

  • Ponad 30 dni temu: -ctime +30

  • Mniej niż 30 dni temu: -ctime -30

  • Dokładnie 30 dni temu: -ctime 30


7
Problem polega na tym, że chcę przetestować dla określonej daty, a nie w określonym przedziale czasowym.
sverrejoh

1
Dowiedz się, ile to dni temu i użyj tej liczby.
jmanning2k

15
ctimenie ma nic wspólnego z czasem tworzenia , to czas zmiany i-węzła.
Stephane Chazelas

47

To dwa kroki, ale lubię to robić w ten sposób:

Najpierw utwórz plik z określoną datą / godziną. W tym przypadku plik jest o 01.10.2008 o północy

touch -t 0810010000 /tmp/t

Teraz możemy znaleźć wszystkie pliki, które są nowsze lub starsze niż powyższy plik (idąc według daty modyfikacji pliku. Możesz również użyć opcji -anewer w celu uzyskania dostępu i zmiany statusu pliku -cnewer ).

find / -newer /tmp/t
find / -not -newer /tmp/t

Możesz także przeglądać pliki między określonymi datami, tworząc dwa pliki za pomocą dotyku

touch -t 0810010000 /tmp/t1
touch -t 0810011000 /tmp/t2

To znajdzie pliki między dwiema datami i godzinami

find / -newer /tmp/t1 -and -not -newer /tmp/t2

3
+1 za rozwiązanie dla starszego, findktóremu brakuje-newerXY
Felipe Alvarez

1
IMO, teraz powinno to być przyjęte rozwiązanie. Nie mogłem zmusić -newermt do uruchomienia na jądrze 2.6.18-348.18.1.el5, nie mówiąc już o nowszych jądrach.
DarkForce,

Tak samo tutaj, DarkForce, nowa funkcja wydaje się być bardzo dziwna
niken

34

Możesz to zrobić:

find ./ -type f -ls |grep '10 Sep'

Przykład:

[root@pbx etc]# find /var/ -type f -ls | grep "Dec 24"
791235    4 -rw-r--r--   1 root     root           29 Dec 24 03:24 /var/lib/prelink/full
798227  288 -rw-r--r--   1 root     root       292323 Dec 24 23:53 /var/log/sa/sar24
797244  320 -rw-r--r--   1 root     root       321300 Dec 24 23:50 /var/log/sa/sa24

Tego chce większość ludzi, ale nie otrzymała wystarczającej liczby głosów pozytywnych !!!
sjas

2
może to nie działać w przypadku posiadania kilku milionów plików w jednym katalogu.
Dennis Nolte

3
Istnieją skutki uboczne, jeśli wyszukiwane hasło grep znajduje się w nazwie pliku.
Snorex

mywiki.wooledge.org/ParsingLs - lepszym podejściem jest prawdopodobnie wydrukowanie daty utworzenia w formie do odczytu maszynowego, być może z, statjeśli nie masz find -printf.
tripleee

12

Nie możesz Przełącznik -c informuje, kiedy uprawnienia zostały ostatnio zmienione, -a testuje najnowszy czas dostępu i -m testuje czas modyfikacji. System plików używany przez większość odmian Linuksa (ext3) nie obsługuje rekordu „czasu tworzenia”. Przepraszam!


7
W rzeczywistości nie jest to tylko typ systemu plików - nie ma interfejsu systemu do uzyskiwania takich informacji, nawet jeśli system plików je przechowywał. Jeden z braków Uniksa, sięgający do najwcześniejszych dni, dlatego Unix nigdy nie wystartuje.
chrisdowney

1
Unix nigdy nie wystartuje?
lucid_dreamer

8

@Max: ma rację co do czasu utworzenia.

Jednakże, jeśli chcesz obliczyć, jaki upłynął dni argumentu za jeden z -atime, -ctime, -mtimeparametry, można użyć następującego wyrażenia

ELAPSED_DAYS=$(( ( $(date +%s) - $(date -d '2008-09-24' +%s) ) / 60 / 60 / 24 - 1 ))

Zamień „2008-09-24” na dowolną datę, a ELAPSED_DAYS zostanie ustawiona na liczbę dni od tej pory do dzisiaj. (Aktualizacja: odejmij jeden od wyniku, aby wyrównać z findzaokrągleniem daty).

Tak więc, aby znaleźć dowolny plik zmodyfikowany 24 września 2008 r., Polecenie to:

find . -type f -mtime $(( ( $(date +%s) - $(date -d '2008-09-24' +%s) ) / 60 / 60 / 24 - 1 ))

Działa to, jeśli twoja wersja findnie obsługuje -newerXYpredykatów wymienionych w odpowiedzi na @Arve:.


2

Za pomocą przełączników -atime, -ctime i -mtime znajdziesz, możesz zbliżyć się do tego, co chcesz osiągnąć.


-3
cp `ls -ltr | grep 'Jun 14' | perl -wne 's/^.*\s+(\S+)$/$1/; print $1 . "\n";'` /some_destination_dir

1
Dlaczego kopiujesz pliki? Oprócz polecenia `ls ...`działa, nie używa findnarzędzia.
Yamaneko,

-5

Znalazłem ten skrypt w skrypcie, który usuwa wszystkie pliki starsze niż 14 dni:

CNT=0
for i in $(find -type f -ctime +14); do
  ((CNT = CNT + 1))
  echo -n "." >> $PROGRESS
  rm -f $i
done
echo deleted $CNT files, done at $(date "+%H:%M:%S") >> $LOG

Myślę, że trochę dodatkowego „man find” i szukania parametrów -ctime / -atime itp. Pomoże ci tutaj.

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.