Sortir file dalam direktori secara rekursif berdasarkan tanggal modifikasi terakhir

11

Sortir file dalam direktori secara rekursif berdasarkan tanggal modifikasi terakhir

Saya telah memodifikasi banyak file di direktori saya ingin tahu file apa itu dengan menyortirnya berdasarkan tanggal modifikasi terakhir dan saya ingin beberapa ekstensi dikecualikan.

di direktori svn saya juga punya banyak file .svn yang tidak ingin saya tampilkan

Danny
sumber
Saya mendemonstrasikan cara mengecualikan ekstensi dalam jawaban saya.
mikeserv

Jawaban:

18
find -printf "%TY-%Tm-%Td %TT %p\n" | sort -n

akan memberi Anda sesuatu seperti

2014-03-31 04: 10: 54.8596422640 ./foo
2014-04-01 01: 02: 11.9635521720 ./bar

n.st
sumber
Bisakah saya mengecualikan ekstensi file dari folder ....
Danny
@Danny Ya, itu mudah dengan menemukan: find -not -iname '*.ext'.
n.st
menemukan -tidak -path " svn " -bukan -name "* svn" -printf "% TY-% TM% Td% TT% p \ n" | semacam -n ini persis apa yang saya butuhkan terima kasih banyak @ n.st
Danny
5

Jika Anda ingin meratakan struktur direktori (dengan demikian mengurutkan berdasarkan tanggal pada semua file di semua direktori, mengabaikan direktori apa file berada di) pendekatan find-ro yang disarankan oleh @yeti adalah cara untuk pergi. Jika Anda ingin mempertahankan struktur direktori, Anda dapat mencoba

$ ls -ltR /path/to/directory

yang berdasarkan jenis direktori.

Andreas Wiese
sumber
1
ini memberi saya folder bijaksana di mana apa yang saya butuhkan adalah bersama-sama apa saja file yang baru-baru ini dimodifikasi
Danny
5

Di bash, jalankan shopt -s globstardulu. Di ksh93, jalankan set -o globstardulu. Di zsh, Anda sudah siap.

ls -dltr **/*

Ini akan mengembalikan kesalahan jika Anda memiliki begitu banyak file yang melebihi batas panjang perintah pada sistem Anda. Di zsh, Anda dapat menggunakan ini sebagai gantinya:

print -rl -- **/*(Om)
Gilles 'SANGAT berhenti menjadi jahat'
sumber
Ini adalah satu-satunya jawaban di sini yang berfungsi untuk Solaris 10, terima kasih! :)
laxxy
3

Dengan asumsi Anda hanya menemukan GNU, coba:

find $SOMEPATH -exec stat -c '%Y %n' '{}' + | sort -n

sumber
1
Anda bisa menggunakan find's -printfpilihan untuk menghindari memohon proses terpisah (atau beberapa, tergantung pada jumlah file). Lihat jawaban saya sebagai contoh.
n.st
1
Mengetahui bahwa ada cara lain untuk melakukannya, saya ingin memberikan statkesempatan dan pertunjukan -exec ... +. Betulkah! Terkadang saya berpikir, statpatut mendapat perhatian lebih ... dan tidak seorang pun boleh mengambil resep dari sini tanpa membaca bahan-bahannya dan memikirkan konsekuensinya ...
Btw ... tidak setiap ditemukan -printf...
1
@yeti - Jika findtidak -printf, Anda dapat menggunakan -exec sh -c 'printf...'untuk mendapatkan banyak fungsi yang sama. Itu akan mencakup akses ke $(pwd)jalur yang sepenuhnya memenuhi syarat juga.
mikeserv
2
Saya bertemu banyak pengguna linux yang belum pernah membaca stat. Jadi kadang-kadang saya hanya ingin mengarahkan perhatian pada stat... Saya pikir statlayak untuk itu ...
2

Untuk daftar nama file dengan kuat hanya menggunakan alat GNU terbaru:

find . -printf '%A@ %p\0' |
  sort -nz |
  sed -z 's/^[^ ]* //' |
  tr '\0' '\n'
Graeme
sumber
2
find $DIR -depth -maxdepth 3 \
    -type d -readable -printf \
    'printf "\\n%p\\n"
    ls -t --color=always "%p"\n' |\
    . /dev/stdin 2>&-

Ini menghindari masalah daftar argumen karena satu-satunya argumen yang lsakan diterima adalah nama direktori yang ingin Anda daftarkan. Anda dapat melakukan ini dengan apa pun yang Anda suka.

Shell hanya . sourcesitu |pipesebagai shell script - itu proses yang sama dan tidak memiliki masalah Anda dapat menemukan ketika execvedisebut.

Dalam hal apa pun - yang di atas hanya tiga kedalaman yang dapat disesuaikan dengan mengubah maxdepth. Ini juga mendalam dulu - jadi Anda bekerja mundur ke direktori saat ini dari depth.

Anda mungkin memperhatikan Anda juga mendapatkan $LSCOLORS- di mesin saya itu juga menyediakan kolom tercetak rapi dan segala sesuatu yang Anda inginkan ls- atau, dalam hal ini, apa pun yang dapat Anda bayangkan akan Anda lakukan dengan. source.

TANPA SVN

Sekali lagi, ini akan melakukan apa pun yang Anda harapkan ls. Jadi menyembunyikan .svnfile semudah mengubah lsbaris menjadi:

ls -t --color=always --hide="*svn" "%p"\n

Atau jika Anda ingin melihat svnekstensi di setiap folder TETAPI ./svnAnda bisa mengubahnya sehingga seluruh perintah terlihat seperti ini:

    find $DIR -depth -maxdepth 3 \
        -type d -readable -printf \
            'printf "\\n%p\\n" ; hide=
            [ "%p" = "./svn" ] && hide="*svn"
            ls -t --color=always --hide="$hide" "%p"\n' |\
    . /dev/stdin 2>&-

Secara pribadi, saya suka dengan ls -sdan, jika Anda peduli, -uakan mengurutkan berdasarkan waktu akses daripada waktu mod.

mikeserv
sumber
1

Ini akan menampilkan semua files di <dir>dengan makhluk paling atas tertua dimodifikasi

find <dir> -type f -print0 | xargs -0 ls -ltr

Dan dengan ini modifikasi terbaru adalah yang teratas

find <dir> -type f -print0 | xargs -0 ls -lt

Perhatikan bahwa ini hanya berfungsi jika daftar nama file tidak melebihi batas panjang baris perintah total pada sistem Anda.

UnX
sumber
benar, saya lupa tentang itu
UnX
untuk referensi tentang perintah: daftar arg terlalu panjang di-ulm.de/ ~mascheck
various
@Gilles: Maksud Anda xargs -0(dalam kedua kasus).  xargs -print0setara dengan xargs -p -r -i -n -t -0atau xargs -inprt0atau xargs -0ntrip, yang mungkin bukan yang Anda maksudkan.
Scott