Dizindeki dosyaları, son değiştirilme tarihine göre yinelemeli olarak sıralayın


11

Dizindeki dosyaları, son değiştirilme tarihine göre yinelemeli olarak sıralayın

Dizindeki bir çok dosyayı değiştirdim, son değiştirilme tarihine göre sıralayarak bu dosyaların ne olduğunu bilmek istiyorum ve bazı uzantıların hariç tutulmasını istiyorum

svn dizininde ben de sıralamada göstermek istemiyorum bir çok .svn dosyaları var


Cevabımdaki uzantıyı nasıl hariç tutacağımı gösteriyorum.
mikeserv

Yanıtlar:


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

sana böyle bir şey verecek

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


Bir dosya uzantısını klasörden hariç tutabilir miyim ...
Danny

@Danny Evet, bu Bul ile kolay: find -not -iname '*.ext'.
n.st

-not -Path "bulmak svn " -not -adı "* svn" -printf "% TY-% TM% Td% TT% p \ n" | sıralama -n bu tam olarak ihtiyacım olan şey çok teşekkürler @ n.st
Danny

5

Dizin yapısını düzleştirmek istiyorsanız (böylece tüm dizinlerdeki tüm dosyalar üzerinde tarihe göre sıralama yapmak, dosyaların hangi dizinde bulunduğunu göz ardı etmek) find@yeti tarafından önerilen -approach yolu budur. Dizin yapısını korumak istiyorsanız,

$ ls -ltR /path/to/directory

hangi dizin tabanlı sıralar.


1
Bu bana akıllıca bir klasör vermek nerede ihtiyacım olarak hep birlikte son değiştirilen dosyaları
Danny

5

Bash'da shopt -s globstarönce koş . Ksh93'te set -o globstarönce koş . Zsh'de zaten hazırsınız.

ls -dltr **/*

Sisteminizdeki komut satırı uzunluk sınırını aşacak kadar çok dosyanız varsa bu bir hata döndürür. Zsh'de, bunun yerine bunu kullanabilirsiniz:

print -rl -- **/*(Om)

Solaris 10 için çalışan tek cevap bu, teşekkürler! :)
laxxy

3

GNU find'ı kullandığınızı varsayarak şunu deneyin:

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

1
Ayrı bir işlemi (veya dosya sayısına bağlı olarak birkaç tane) çağırmaktan kaçınmak için find' -printfseçeneğini kullanabilirsiniz . Bir örnek için cevabımı görün .
n.st

1
Bunu yapmanın başka yolları olduğunu bilerek, bir şans ve şov vermek istedim . Gerçekten mi! Bazen düşünüyorum, daha fazla dikkat hak ediyor ... ve hiç kimse malzemeler hakkında okumadan ve sonuçları hakkında düşünmeden tarifleri almalıdır ...stat-exec ... +stat

Btw ... değil her buluntu -printf...

1
@yeti - Eğer senin findyok -printf, sen kullanabilirsiniz -exec sh -c 'printf...'hemen aynı işlevselliği elde etmek. Buna $(pwd)tam yollara erişim de dahildir.
mikeserv

2
Daha önce hiç okumamış birçok linux kullanıcısıyla tanıştım stat. Bu yüzden bazen sadece biraz dikkat çekmek istiyorum stat... Sanırım bunu stathak ediyor ...

2

Dosya adlarını yalnızca en son GNU araçlarını kullanarak sağlam bir şekilde listelemek için:

find . -printf '%A@ %p\0' |
  sort -nz |
  sed -z 's/^[^ ]* //' |
  tr '\0' '\n'

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

Bu, herhangi bir bağımsız değişken listesi sorununu önler çünkü lsşimdiye kadar alacak tek bağımsız değişken , listelenmesini istediğiniz dizinin adıdır. Bunu istediğiniz herhangi bir şeyle yapabilirsiniz.

Kabuk sadece bir kabuk komut dosyası olarak - bu aynı süreç ve karşılaşabileceğiniz çıkabilecek sorunlar yoktur denir.. sources|pipeexecve

Her durumda - yukarıdakiler sadece üç derine iner ve bu da değiştirilerek ayarlanabilir maxdepth. Ayrıca önce derin - böylece geçerli dizininizden geriye doğru çalışırsınız depth.

Ayrıca $LSCOLORS, makinemde düzgün bir şekilde yazdırılmış sütunlar ve istediğiniz her şeyi sağlar ls- veya bu konuda, yapmak istediğinizi hayal edebileceğiniz her şeyi de görebilirsiniz.. source.

SVN YOK

Yine, bu beklediğiniz her şeyi yapar ls. Yani .svndosyaları gizlemek lssatırı şu şekilde değiştirmek kadar basit :

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

Veya svnher klasördeki uzantıları görmek istiyorsanız ANCAK ./svndeğiştirebilirsiniz, böylece tüm komut şöyle görünür:

    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>&-

Şahsen, ls ile beğendim -sve eğer ilgilenirseniz, -umod zamanı yerine erişim süresine göre sıralanır.


1

Bunun her listeler files içinde <dir>en üstteki varlık eski modifiye ile

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

Ve bununla en son değiştirilen en üstte

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

Bunun yalnızca dosya adları listesinin sisteminizdeki toplam komut satırı uzunluk sınırını aşmaması durumunda işe yaradığını unutmayın.


doğru, bunu unuttum
UnX

komut hakkında başvuru için : arg list çok uzun in-ulm.de/~mascheck/various/argmax
UnX

@Gilles: Yani xargs -0(her iki durumda da).  ya da ya da xargs -print0eşdeğerdir , ki bu muhtemelen ne demek istediğiniz değildir. xargs -p -r -i -n -t -0xargs -inprt0xargs -0ntrip
Scott
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.