Jak wyświetlić zmodyfikowaną datę za pomocą polecenia „znajdź”?

85

Za pomocą findpolecenia mogę wyświetlać nazwy katalogów na wielu poziomach. Następujące polecenie wyświetla wszystkie katalogi pod /varścieżką o głębokości 2:

find /var -maxdepth 2 -type d;

Wynik pokazuje:

/var
/var/log
/var/log/sssd
/var/log/samba
/var/log/audit
/var/log/ConsoleKit
/var/log/gdm
/var/log/sa

Za pomocą statpolecenia mogę znaleźć zmodyfikowaną datę i godzinę:

stat /var/log/samba | grep 'Modify:'

Wynik to:

Modify: 2014-01-02 11:21:27.762346214 -0800 

Czy istnieje sposób na połączenie tych dwóch poleceń, aby katalogi były wyświetlane ze zmodyfikowaną datą i godziną?

Purres
źródło

Odpowiedzi:

63

Możesz użyć -execprzełącznika findi zdefiniować format wyjściowy za statpomocą -cprzełącznika w następujący sposób:

find /var -maxdepth 2 -type d -exec stat -c "%n %y" {} \;

Powinno to dać nazwę pliku, po której następuje jego czas modyfikacji w tym samym wierszu wyniku.

rc0r
źródło
to lepsze niż moja odpowiedź, +1
Kent
Poniższa -printfopcja pozwala uniknąć wywoływania statkażdego znalezionego pliku. W moim teście polecenie daje prawie identyczny wynik, tylko dodatkowa cyfra z dokładnością do sekund.
mwfearnley
W systemie MacOS znak formatu arg dla statto -f. find /var -maxdepth 2 -type d -exec stat -f "%t%Sm %N" {} \;
toddcscar
126

Zaakceptowana odpowiedź działa, ale jest powolna. Nie ma potrzeby wykonywania statystyk dla każdego katalogu, find podaje datę modyfikacji i możesz po prostu wydrukować ją bezpośrednio. Oto równoważne polecenie, które jest znacznie szybsze:

 find /var -maxdepth 2 -type d -printf "%p %TY-%Tm-%Td %TH:%TM:%TS %Tz\n"
kzar
źródło
4
O wiele lepsze rozwiązanie. Działa również findz msys działającym w systemie Windows, któremu brakuje statpolecenia.
Snorfalorpagus
7
Na komputerach Mac „brew install findutils”, a następnie gfind ma opcję -printf.
WeakPointer
%Tcwypisuje "datę i godzinę lokalną", zezwalając na łańcuch formatu "% p% Tc"
Andreas
Bardziej pomocne linki do wyjaśnienia% formaterów. unix.stackexchange.com/a/215236/216480 lub na stronie podręcznika wyszukaj „-printf format”
styks
1
Chociaż ciąg formatu „% p% Tc” działa, formatuje dane wyjściowe nieco inaczej. Np. „/ Var / spool Mon 29 Sep 2014 09:05:54 BST” zamiast „/ var / spool 2014-09-29 09: 05: 54.000000000 +0100”.
kzar
15

find /var -maxdepth 2 -type d | xargs ls -oAHd

Jest to sposób na uzyskanie podstawowego lspolecenia wyświetlającego pełną ścieżkę katalogu. Choć lsma -Rparametr dla rekurencyjnego wyszukiwania, ścieżki nie będą wyświetlane w wynikach z -llub -oopcji (w OSX, przynajmniej), ex z: ls -lR.

znak
źródło
Dodaj wyjaśnienie, dlaczego to odpowiada na pytanie. Ogólnie rzecz biorąc, za każdym razem, gdy publikujesz przykładowy kod w odpowiedzi na StackOverflow, kultura ma zawsze zawierać wyjaśnienie. W przeciwnym razie istnieje ryzyko, że moderatorzy usuwają Twoją odpowiedź jako niskiej jakości ze względu na jej krótką długość i brak wyjaśnienia.
sideshowbarker
3
Ten, który możesz osiągnąć, find /var -maxdepth 2 -type d -lsjest po prostu prostszy.
Grzegorz Krauze
13

Najnowsze wersje GNU zawierają findrównież -printfopcję, która zawiera pola daty. Jeśli potrzebujesz wydrukować nazwę pliku i czas modyfikacji w standardowym formacie „C”, możesz użyć -printf "%c %p\n".

Jeśli chcesz, aby data miała określony format, możesz użyć %Cznaku następującego po nim. Na przykład rok 4-cyfrowy byłby %CYz Ybycia znaków dla 4-cyfrowy rok.
Pamiętaj, że jeśli potrzebujesz wielu pól, musisz określić je %Cwiele razy. Na przykład wyglądałby format RRRR-MM-DD %CY-%Cm-%Cd.

Sprawdź strony podręcznika lub dokumentację online, aby uzyskać dodatkowe informacje.

Oto działający przykład:

find . -name favicon.ico -printf "%c %p\n"
Panie Lama
źródło
8

Kolejny, którego używam do drukowania zmodyfikowanych plików w ciągu ostatniego dnia. ls -ltr daje mi bardziej szczegółowe informacje, takie jak czas modyfikacji, użytkownik itp

find <my_dir> -mtime -1 -type f -print | xargs ls -ltr 
user666
źródło
1
To jest najprostszy, najłatwiejszy do zapamiętania i najszybszy do wpisania. (Używam go bez argumentów -mtime i -type, zamiast tego używam -name '*.ext'specyfikacji. ls -ltSortuje według czasu modyfikacji.)
Brent Faust
2
To nie działa, gdy nazwa pliku zawiera spacje. Lepiej jest użyć -print0zamiast, -printa następnie użyć xargs -0zamiast xargs.
emk2203
xargsmoże wywołać polecenie ( lstutaj) kilka razy, w zależności od liczby parametrów, aby zapobiec wywołaniu polecenia z nadmierną liczbą parametrów. Dlatego sortowanie (bez względu na kryterium, w tym według daty) może dać „zły” wynik (=> lista posortowanych podzbiorów, zamiast pełnego posortowanego zestawu).
syme
1

spróbuj tej linii:

find /var -maxdepth 2 -type d|xargs stat|grep -E 'File|Modi'

tutaj go uruchomiłem, wyświetla:

....
  File: ‘/var/cache/cups’
Modify: 2013-12-24 00:42:59.808906421 +0100
  File: ‘/var/log’
Modify: 2014-01-01 12:41:50.622172106 +0100
  File: ‘/var/log/old’
Modify: 2013-05-31 20:40:23.000000000 +0200
  File: ‘/var/log/journal’
Modify: 2013-12-15 18:56:58.319351603 +0100
  File: ‘/var/log/speech-dispatcher’
Modify: 2013-10-27 01:00:08.000000000 +0200
  File: ‘/var/log/cups’
Modify: 2013-12-22 00:49:52.888346088 +0100
  File: ‘/var/opt’
Modify: 2013-05-31 20:40:23.000000000 +0200
....
Kent
źródło