Dosya adında “2015” ile bir günden eski dosyalar nasıl listelenir?


11

Bugüne ait olmayan tüm günlük dosyalarını ve yalnızca 2015adlarında bulunan dosyaları listelemek istiyorum .

Bunlar denedim komutlar:

find . -name 2015 -mtime +1 -exec  ls -ltrh  {} \;
find . -name *2015* -mtime +1 -exec  ls -ltrh  {} \;

Her ikisinden çıktı hiçbir şey değildir, ama yine de dosyalar vardır. Bu komutlarla ilgili bir sorun var ve ben ne elde edemiyorum. Herhangi bir yardım mutluluk duyacağız.


findBölüm bana iyi görünüyor, ama ben de ile ilgili sorunlar vardı -execparametre. Bunu da çalıştıramadım. (Tüm jpg dosyalarını bir klasörden üst dizinine taşımaya çalışıyordum - ve elle yaptım ...)
Byte Komutanı


@steeldriver Ben buna geçerli dizinde dosyaları olsaydı beri, yanlış burada neler olduğunu gerçekten düşünüyorum 2015ben olacağını sanıyorum kendi adlarına (bu arada diğer belirgin bir eksikliğe komutu yazılır) bazı çıkışın tür. Yani bu konuda bir cevap göndermek isteyebilirsiniz.
Eliah Kagan

Yanıtlar:


18

Komut find . -name '*2015*' -mmin +1440 -lsmuhtemelen istediğinizi yapar. Ayrıntılar için aşağıya bakın.

İlk emriniz vardı -name 2015. Bu, işe yaramadı çünkü yalnızca adları tam olan 2015 , içinde başka karakter bulunmayan dosyaları bulur .

İkinci komutunuz, find . -name *2015* -mtime +1 -exec ls -ltrh {} \;birkaç nedenden dolayı başarısız olmuş olabilir:

1. Alıntılanmamış *karakterler kabuk tarafından genişletilir ve daha sonra 'e aktarılır find.

Doğrudan geçerli dizinde (bu find ...komutu çalıştırdığınızda bulunduğunuz dosya ) isimleri içeren 2015(ve a ile başlamamış .) herhangi bir dosya varsa, kabuk*2015* bu dosya adlarının bir listesine genişledi ve sonra geçti bu listeyi argüman olarak find. İstediğiniz bu değil - bunun yerine, *2015*kelimenin tam anlamıyla bulmak için bir argüman olarak geçmek istersiniz , böylece findkabuk değil, hangi dosyaların kendisiyle eşleştiğini bulabilir.

Bu sorunu çözmek için alıntı yapın *2015*. Bunu yapmanın üç yaygın yolu vardır:

  • '*2015*'(yani, find . -name '*2015*' -mtime +1 -exec ls -ltrh {} \;)
  • "*2015*"(yani, find . -name "*2015*" -mtime +1 -exec ls -ltrh {} \;)
  • \*2015\*(yani, find . -name \*2015\* -mtime +1 -exec ls -ltrh {} \;)

Ben öneririz yazmayı tek tırnak ile olduğu gibi '*2015*', çünkü:

Ancak bu durumda önemli değil. 've "her ikisi *de aynı şekilde davranır ve ifade, \alıntıyı anlamayı zorlaştıracak kadar karmaşık değildir .

2. -mtime +1yalnızca iki veya daha fazla gün önce değiştirilmiş dosyaları seçer .

As man finddiyor ki:

       Numeric arguments can be specified as

       +n     for greater than n,

       -n     for less than n,

       n      for exactly n.
       -mtime n
              File's data was last modified n*24 hours ago.  See the  comments
              for -atime to understand how rounding affects the interpretation
              of file modification times.
       -atime n
              File was last accessed n*24 hours ago.  When  find  figures  out
              how  many  24-hour  periods  ago the file was last accessed, any
              fractional part is ignored, so to match -atime +1, a file has to
              have been accessed at least two days ago.

Bir dosyanın 47 saat önce değiştirildiğini varsayalım. Kaç 24 saat olduğu dönemlerde, anlamaya findmermi aşağı : öyle bir 24 saatlik dönem önce. Ancak -mtime +1yalnızca değişiklik süreleri 24 saatten daha uzun bir süre önce olan dosyalarla eşleşir . Böylece dünden gelen dosyalar eşleşmez.

Bkz. Find -mtime +1 neden yalnızca 2 günden daha eski dosyaları döndürüyor? steeldriver tarafından önerilen daha fazla bilgi için .

En son 24 saat önce herhangi bir zamanda değiştirilen dosyaları bulmak için bunun yerine 1440 dakika önce şununla belirtilmesini öneriyorum -mmin +1440:

find . -name '*2015*' -mmin +1440 -exec ls -ltrh {} \;

Bazı okuyucular neden alıntı yapmadığımı merak ediyor olabilirler {}. Bazı insanlar {}, insanlara bunun genişlemenin bir ifadesi olmadığını hatırlatmayı teklif eder . Bourne tarzı mermiler ( bash gibi ) , içinde hiçbir şey belirtilmek zorunda değildir{} . Belki Bourne tarzı olmayan bir kabuk özel olarak tedavi eder; bu yüzden bazı kullanıcılar bunu teklif eder. Ancak , bazen alıntı yapılması gereken yanlış bir kavram da vardır, bu {}nedenle -execdosya adlarını boşluklarla doğru şekilde işler. Bu s sahte: ile {}ya da '{}', findalır aynı kabuk olarak, bağımsız değişkenler tırnak kaldırır geçirmeden önce '{}'içinfind. Bu yanlış anlama karşı koymak için, teklif etmiyorum {}, ama bu bir stil meselesi - {}kabuğun nasıl davranmadığını {ve }özellikle de özel olarak işlemediğini belgelemeyi tercih ederseniz , sorun değil .

Ben de ya da değiştirmek tavsiye lskomutu veya (aynı muru önerdi ) ile değiştirin findbireyin -lseylem. ls -ltrhmuhtemelen istediğiniz her şeyi yapmaz, çünkü bulunan her dosya için ayrı çalıştırılır ve bu nedenle sıralamayı belirten -tve -rbayrakları önemsizdir.

Çıktı ,kinden biraz farklı biçimlendirilecek olsa da ls -l, -lskullanımı daha basit ve kolaydır.

find . -name '*2015*' -mmin +1440 -ls

Veya yalnızca dosyanın adlarını listelemeniz gerektiğine karar verirseniz (göreceli olarak yolları dahil .), hiçbir eylem belirtebilir ve varsayılan -printeylemin kullanılmasına neden olabilirsiniz:

find . -name '*2015*' -mmin +1440

1
Güzel kapsamlı cevap! en azından GNU find ile, newerXYtakvim argümanlarını kabul eden sözdizimi de vardır , örn. -newermt 'yesterday've! -newermt 'yesterday'
steeldriver

Biliyor musun ? @ Eliah Kagan
rɑːdʒɑ

Teşekkürler stell sürücüsü, bu bağlantıdan bilmek çok iyi bir bilgi. Ama benim durumumda olduğu gibi uygulama uygulama günlüğü eski dosyaları değiştirilmek için hiçbir yolu var. Thank you again
rɑːdʒɑ

2

İfadeyi alıntılayın ve parantezleri de alıntılamanızı öneririm

find . -name "2015" -mtime +1 -exec  ls -ltrh  '{}' \;

veya

find . -name "*2015*" -mtime +1 -exec  ls -ltrh  '{}' \;

Bulduğunuz dosyaları ls'ye iletmeniz gerekmez

find . -name "*2015*" -mtime +1

Belki kullanarak kısıtlamak -type f? Ve eğer lskullanılması gerekiyorsa, kullanmanızı öneririz -ls.
muru

1
elbette, tüm iyi öneriler. Ben OP ne istediğinden emin değilim ve sorunun kaynağı "-name" arama kalıbı etrafında tırnak eksikliği olduğuna inanıyorum.
Panther

2

In zsh kullanabileceğiniz glob eleme (bu bash gibi diğer kabukları bulunmayan eşsiz bir zsh özelliğidir).

ls -ltr *2015*(m+1)

Bu yalnızca geçerli dizindeki dosyaları listeler; için yinelemeli çapraz dizinleri , kullanım

ls -ltr **/*2015*(m+1)

İle find, -name 2015sadece ismi tam olarak dosyaları bulur 2015. -name *2015*Adını içeren herhangi bir dosya varsa çalışır 2015geçerli dizinde kabuk deseni genişler, çünkü *2015*daha önce findçağrılır. Deseni alıntılamanız gerekir:

find -name '*2015*' -mtime +1 …

Her ikisinin de find -mtime +1ve zsh'ın bugünden daha eski dosyaları değil *(m+1), en az 48 saatlik dosyaları bulduğunu unutmayın . Artı işareti “kesinlikle daha fazla” anlamına gelir ve gün sayısı yuvarlanır. En az 24 saatlik dosyaları bulmak için -mtime +0veya tuşlarını kullanın (m+0).

Dün veya daha önce en son değiştirilen dosyaları bulmak istiyorsanız find, -newermtyüklemle birlikte kullanabilirsiniz :

find -name '*2015*' ! -newermt 'today 0:00' …

Bu testi zsh ile yapmak için gerçekten uygun bir yol yoktur.

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.