2011-03-13 7 views
11

Belirli bir ayda (örneğin, Şubat) değiştirilen dosyaları listeleme konusunda zorlanıyorum. İşte birkaç başarısız girişimleri şunlardır:UNIX/BASH: Belirli bir ayda değiştirilen dosyaları listeleme

1) geçici dosyaları oluşturma ve bu gibi gelecek aya ilk defa kendi zaman damgasını ayarlama ve hedef ayda ilk kez ve Bul içinde -newer kullanmak çalıştı:

find -newer "$from" ! -newer "$to" 

Bu, zaman aralığında değiştirilen dosyaları listeler ($ from, $ to), ancak zaman aralığını [$ from, $ to) istiyorum (aksi takdirde, ilk saniyede oluşturulan dosyalarda yanlış pozitifler olur) gelecek ay). Şubat ayında değiştirilen listeleme dosyaları fazladan bir sorundur çünkü bu zaman damgalarından birini Şubat ayında hala en büyük olana ayarlamanızı gerektirecektir. Ancak, Şubat'taki gün sayısı, bir artış yılı olup olmadığına bağlı olarak değişir. .

2) ls kullanırsam Kullanıcı adı veya grubunun boşluk içerme olasılığı nedeniyle ayrıştırma sırasında çok fazla sorun görüyorum.

Bunu yapmak için kolay bir yol ve nispeten portatif bir yol var mı (bu nedenle dosya adlarından bağımsız olarak her ay çalışır)? Ben find-printf bir sonuç kendisini filtre sanmıyorum

find -printf "%Cm %p\\n"| egrep ^02 |cut -b4- 

, ne de tarih unsurları filtreleyebilirsiniz:

+1

Bunu [ayrıştırmak olmamalı 'ls'] (http://mywiki.wooledge.org/ParsingLs) keşfettiğiniz olarak. –

cevap

15

dateallows kolayca böyle amaçlar için damgaları oluşturmak için:

date -d "01-Mar-2011 -1 sec" # last second of Feb-2011 

Neyse ki, aynı sözdizimi find mümkündür:

month="Mar-2010" 
find . -newermt "01-$month -1 sec" -and -not -newermt "01-$month +1 month -1 sec" 
Mart ayında değiştirilen tüm dosyaları bulacaksınız
0

bir geçici çözüm find için -printf seçeneğini kullanmayı olabilir.

düzenlemek yoksa gerçekten ls benzeri çıkışını isterseniz:

find -printf "%Cm " -ls | egrep ^02 |cut -b4- 
+0

Taşınabilir '-printf''in nasıl olduğundan emin değil misiniz? Solaris'in sahip olmadığı görülüyor. – Mat

3

Peki, sadece olan asgari bir zaman damgası ve Şubat maksimum bir zaman damgası ve dosyaları dosyaları oluşturabilir Şubat ayının her yönünde.

$ touch -t 201102010000.01 from 
$ touch -t 201102282359.59 to 
$ touch -t 201103010000.01 march 
$ touch -t 201101312359.59 january 

$ ls -l 
total 0 
-rw-r--r-- 1 mike None 0 Feb 1 00:00 from 
-rw-r--r-- 1 mike None 0 Jan 31 23:59 january 
-rw-r--r-- 1 mike None 0 Mar 1 00:00 march 
-rw-r--r-- 1 mike None 0 Feb 28 23:59 to 

Bunun gibi, GNU'yu 'bul' gibi kullanarak, yalnızca zaman damgası Şubat'ta olan dosyaları gösterir gibi görünüyor.

$ find -newermt '2011-02-01' ! -newermt '2011-03-01' -print 
./from 
./to 

Bu argümanların 'bul' diğer sürümleri için ne kadar taşınabilir olduğunu bilmiyorum.

1

Pumbaa80'in yanıtı:

Üretim öncesi ortamımda, bulma -newermt'i desteklemiyor.

yerine yaptığım Ne:

  1. geçen ayın son saniyenin zaman damgaları ve bu ay

    üret (ls vb find aracılığıyla) tüm olası dosyaların bir listesini alın
    LAST_MONTH=$(date -d "01-Jun-2015" -1 sec +%s) 
    THIS_MONTH=$(date -d "31-Jul-2015" +%s) 
    
  2. 1 numaralı listeden liste üzerinde yineleme yapın ve her dosyanın zaman damgasını 2

    numaralı noktadan zaman damgalarıyla karşılaştırın.
    for file in $LIST_OF_FILES 
    do 
        TIMESTAMP=$(stat -c"%Y" $file) 
        if (($LAST_MONTH < $TIMESTAMP)) 
        then 
         if (($TIMESTAMP < $THIS_MONTH)) 
         then 
         echo "Your code here" 
         fi 
        fi 
    done