Daftar semua file yang baru saja diubah (rekursif)

20

Jadi, saya ingin menampilkan ( lsmisalnya) semua file, yang diubah dalam tujuh hari terakhir. Jika saya berada di folder-docroot saya, seharusnya bisa terlihat "lebih dalam".

Sebagai contoh:

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

Jadi, ls(atau apa pun yang cocok) harus di-output myfile1dan (jika mungkin) MySub/sub1.

Apakah ini bisa dilakukan dengan satu perintah?

DasSaffe
sumber

Jawaban:

38

Tentu saja. Dari direktori yang Anda lakukan:

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

Tambahkan pengalihan untuk itu (alias > results.txtuntuk menyimpannya ke file itu).

  • type f tidak hanya file dan bukan direktori
  • mtime -7 lakukan 7 hari yang lalu hingga sekarang (+7 akan 'lebih tua dari 7 hari')
  • dan kemudian memasukkannya ke lsuntuk menampilkan daftar panjang

Anda dapat bermain dengan ls -lbagian itu juga:

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

akan menampilkan metode seperti pohon dengan direktori di antara file dalam daftar panjang (1) atau daftar pendek (2).

Rinzwind
sumber
4
findpunya lspilihan sehingga Anda bisa melakukannyafind . -type f -mtime -7 -ls
heemayl
Tentu tetapi ini membuatnya sedikit lebih umum (saya menggunakan metode ini untuk menemukan file yang saya perlu -hapus- dan dapat mengubah perintah itu untuk melakukannya :))
Rinzwind
3
Juga lebih tepat untuk menggunakan find ... -exec ls -l {} +yang mengeksekusi ls -ljauh lebih efisien - lebih sedikit kali dengan beberapa parameter. Ini adalah opsi standar yang findditentukan oleh POSIX.
pabouk
5

Dengan zsh:

ls -l **/*(.m-7)
  • **/* akan mencari file secara rekursif mulai dari direktori saat ini

  • (.m-7)adalah glob qualifier di mana .menunjukkan file biasa, m-7menunjukkan file yang telah diubah dalam 7 hari terakhir

heemayl
sumber
2

Perintah berikut berfungsi di Mac OSX - mungkin juga di ubuntu ...

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

Ini menemukan file dalam pohon direktori saat ini yang telah dimodifikasi dalam 7 hari terakhir, menampilkan tanggal modifikasi + waktu dan jalur, disortir terbaru terlebih dahulu.

Contoh output:

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

Saya akan berterima kasih atas umpan balik dari pengguna ubuntu.

TuanWatson
sumber
Satu-satunya solusi yang bekerja dengan baik untuk saya di Mac. Terima kasih!
artnikpro
Selamat datang di @artnikpro!
MrWatson
1

Tidak persis apa yang diminta ... tetapi lebih mudah diingat ...

ls -alRt docroot

atau

ls -alRt /path/to/top/level/directory
heynnema
sumber
0

7 hari yaitu 60 detik * 60 menit * 24 jam * 7 hari = 604800 detik

Cari tahu tanggal saat ini dalam detik (Unix epoch time):

$ date +%s
1448876323

Kurangi 7 hari dalam hitungan detik:

expr $(date +%s) - 604800
1448271548

Sekarang ambil statperintah dan cetak statistik untuk semua file dalam format "nama + waktu dalam detik" dan gunakan awkuntuk memotong file-file yang waktu modifikasi lebih besar dari tanggal yang kami hitung

$ 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

Yang paling menarik adalah 3 file terakhir, karena saya tahu saya mengerjakannya kurang dari 7 hari yang lalu. Jadi saya tahu itu berhasil

Sergiy Kolodyazhnyy
sumber
2
Perhatikan bahwa alih-alih awk '$2 > 1448271265 {print $0}'Anda bisa langsung mengatakannya awk '$2 > 1448271265'. Pada kondisi sebenarnya, awk mencetak baris saat ini sebagai tindakan default.
fedorqui