Wyświetl wszystkie ostatnio zmienione pliki (rekurencyjne)


21

Chcę więc wyświetlić ( lsna przykład) wszystkie pliki, które zostały zmienione w ciągu ostatnich siedmiu dni. Jeśli jestem w folderze docroot, powinien on wyglądać „głębiej”.

Na przykład:

File        Last changed
docroot
|- myfile1  30.11.2015
|- myfile2  10.11.2015
|- MySub
   |-sub1   30.11.2015
   |-sub2   10.11.2015

Tak więc ls(lub cokolwiek pasuje) powinno generować myfile1i (jeśli to możliwe) MySub/sub1.

Czy można to zrobić za pomocą jednego polecenia?

Odpowiedzi:


39

Oczywiście. Z katalogu, w którym jesteś, wykonaj:

find . -type f -mtime -7 -exec ls -l {} \; 

Dodaj do niego przekierowanie (czyli > results.txtteż przechowuj je w tym pliku).

  • type f robi tylko pliki, a nie katalogi
  • mtime -7 robi 7 dni temu do tej pory (+7 byłoby „starsze niż 7 dni”)
  • a następnie karmi go, lsaby wyświetlić długą listę

Możesz także grać ls -lczęścią:

find . -type f -mtime -7 -exec ls -Rl --time-style=long-iso {} \; 
find . -type f -mtime -7 -exec ls -R  --time-style=long-iso {} \; 

pokaże drzewiastą metodę z katalogami pomiędzy plikami na długiej liście (1) lub krótkiej liście (2).


4
findma lsopcję, więc możesz to zrobićfind . -type f -mtime -7 -ls
heemayl

Jasne, ale to sprawia, że ​​jest to nieco bardziej ogólne (używam tej metody do znajdowania plików, które muszę -remove- i mogę zmienić to polecenie, aby to zrobić :))
Rinzwind

3
Również bardziej odpowiednie jest użycie, find ... -exec ls -l {} +które działa ls -lznacznie wydajniej - rzadziej przy wielu parametrach. Jest to standardowa opcja findokreślona przez POSIX.
pabouk

5

Z zsh:

ls -l **/*(.m-7)
  • **/* będzie szukał plików rekurencyjnie, zaczynając od bieżącego katalogu

  • (.m-7)jest globalnym kwalifikatorem, gdzie .wskazuje zwykły plik, m-7wskazuje pliki, które zostały zmodyfikowane w ciągu ostatnich 7 dni


2

Poniższe polecenie działa jak marzenie na Mac OSX - może także na Ubuntu…

find . -type f -mtime -7 -exec stat -lt "%Y-%m-%d %H:%M:%S" {} \; | cut -d\  -f6- | sort -r

Znajduje pliki w bieżącym drzewie katalogów, które zostały zmodyfikowane w ciągu ostatnich 7 dni, wyświetla datę modyfikacji + czas i ścieżkę, posortowane jako najnowsze.

Przykładowe dane wyjściowe:

2018-02-21 22:06:30 ./fmxmlsnippet.xml
2018-02-19 12:56:01 ./diff.html
2018-02-19 12:44:37 ./temp/iDDR/XMSC_fmxmlsnippet.xml
2018-02-18 22:04:05 ./temp/iDDR/XMFD_fmxmlsnippet.xml
2018-02-15 10:18:27 ./xml/iDDR/XML2_fmxmlsnippet.xml
2018-02-15 10:13:29 ./xsl/fmxmlsnippet/XML2_fmCM_AnalyseLayout.xsl
2018-02-15 10:11:36 ./xsl/.DS_Store
2018-02-15 10:10:51 ./xsl/_inc/inc.XML2_fmCM_ReportReferencesToExternalFiles.xsl
2018-02-15 10:10:09 ./xsl/_inc/.DS_Store
2018-02-15 10:07:35 ./xsl/fmxmlsnippet/XML2_fmCM_AnalyseLayout-NoAnchors.xsl
2018-02-15 10:07:35 ./xsl/_inc/inc.XML2_fmCM_AnalyseLayout.xsl

Byłbym wdzięczny za wszelkie opinie od użytkowników ubuntu.


Jedyne rozwiązanie, które działało dla mnie dobrze na Macu. Dzięki!
artnikpro

Serdecznie witamy @artnikpro!
MrWatson,

1

Niezupełnie o co poproszono ... ale o wiele łatwiej zapamiętać ...

ls -alRt docroot

lub

ls -alRt /path/to/top/level/directory

0

7 dni to 60 sekund * 60 minut * 24 godziny * 7 dni = 604800 sekund

Sprawdź aktualną datę w sekundach (czas epoki uniksowej):

$ date +%s
1448876323

Odejmij 7 dni w sekundach:

expr $(date +%s) - 604800
1448271548

Teraz weź statstatystyki poleceń i drukowania dla wszystkich plików w formacie „nazwa + czas w sekundach” i użyj awkdo przycięcia tych plików, których czas modyfikacji jest dłuższy niż obliczona przez nas data

$ stat --printf="%n %Y\n" $HOME/* | awk '$2 > 1448271265 {print $0}'
/home/xieerqi/1448428697574.png 1448429613
/home/xieerqi/1448763343273.png 1448763478
/home/xieerqi/1510DRIVE 1448352453
/home/xieerqi/addRemoveDistribution 1448666843
/home/xieerqi/add-update.awk 1448716356
/home/xieerqi/add-update.sh 1448625092

Szczególnie interesujące są 3 ostatnie pliki, ponieważ wiem, że pracowałem nad nimi mniej niż 7 dni temu. Wiem, że to działa


2
Zauważ, że zamiast awk '$2 > 1448271265 {print $0}'ciebie możesz wprost powiedzieć awk '$2 > 1448271265'. W prawdziwych warunkach awk drukuje bieżącą linię jako akcję domyślną.
fedorqui
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.