Belirli bir tarihte oluşturulan dosyaları aramak için 'bul' nasıl kullanılır? [kapalı]


254

findBelirli bir tarihte oluşturulan dosyaları aramak için UNIX komutunu nasıl kullanırım ?


8
Bas komut dosyası sorularına izin verilmiş gibi görünüyor.
Alan

@MichaelScheper: Bu yorumla nereden başlayacağımı bile bilmiyorum.
Yörüngedeki Hafiflik Yarışları

1
@Notinlist: İşte cevap: meta.stackexchange.com/questions/10249/… Ne yazık ki, bir zaman sınırının süresi doldu. Yazık ki, web aramaları hala buraya geldi ve kabul edilen cevap birçok insan için yararlı oldu.
Michael Scheper

@MichaelScheper: unix.stackexchange.com adresine geçmek için oy vermek için bir seçenek bulabilirseniz, kesinlikle bana işaret edin. Eğer bu yana yok yakın diyalog görmek temsilcisi var, ben size bir ipucu vereyim: Bir yoktur. Ne hakkında konuştuğunuz hakkında hiçbir fikriniz yoksa, daha az kavgacı olmayı düşünün. İlginiz için teşekkürler.
Yörüngedeki Hafiflik Yarışları

5
@LightnessRacesinOrbit: 'Savaşçı' olarak karşılaştığım için özür dilerim. Yorumlarımı düzenlememe izin verilmiyor, ancak ileride başvurmak üzere, sizi rahatsız eden soruyu öven yorumum muydu? Şunu söylemeliyim ki, önceki yorumunuza kuşku duyduktan sonra bile biraz kör hissediyorum. Aslında, göçün nasıl çalıştığına bakarak başka bir 'ben de' eklemekten daha yapıcı olmaya çalışıyordum: meta.stackexchange.com/a/10250/249555 60 günlük süre sınırı bu seçeneği gizliyor olabilir mi? Serseri direksiyon için üzgünüm. Zaman ayırdığınız ve ilginiz için tekrar teşekkür ederiz.
Michael Scheper

Yanıtlar:


323

Max'in işaret ettiği gibi yapamazsınız, ancak değiştirilen veya erişilen dosyaları kontrol etmek o kadar da zor değildir. Bu güne kadar geç bir eğitim yazdım . Özü kullanmak -newerXYve! -newerXY :

Örnek: 7 Haziran 2007'de değiştirilen tüm dosyaları bulmak için:

$ find . -type f -newermt 2007-06-07 ! -newermt 2007-06-08

29 Eylül 2008'de erişilen tüm dosyaları bulmak için:

$ find . -type f -newerat 2008-09-29 ! -newerat 2008-09-30

Veya izinleri aynı gün değişen dosyalar:

$ find . -type f -newerct 2008-09-29 ! -newerct 2008-09-30

Dosyadaki izinleri değiştirmezseniz, 'c' normalde oluşturma tarihine karşılık gelir.


7
Find sürümüm (GNU 4.2.32) -newerXY tahminlerini desteklemiyor gibi görünüyor. Özel bir minimum sürüm gerekli mi? Yoksa özel bir yapılandırma anahtarıyla bulmayı derlemek mi?
yukondude

1
@yukondude: Haklısın. Yerel olarak sahip olduğum bulma sürümü - GNU 4.4.0 - sahipken, 4.1.20 Dreamhost'ta var. Yine de, iki dosya oluşturan çamur da çalışmalıdır.
Arve

1
Bazı sistemlerde (FreeBSD, OS / X ...) -newerBtdosyanın doğum (oluşturma) zamanında eşleşecektir .
Stephane Chazelas

3
Not olduğunu -newerxtmevcuttur FreeBSD (ilk sağlandı 2001 yılından bu yana bir yama olarak 1998 yılında), birkaç diğer BSD ve GNU bulmak tanıtıldı HP / UX bulmak dayanan, (2007 yılında 4.3.3 beri) -newerXY(fakat Y == t desteklenmez).
Stephane Chazelas

Find: (GNU findutils) 4.4.0 kullanarak, bu sözdizimi SUSE ext3 üzerinde çalışmaz, eğer o tarihte dosyaları / w
mtime'ı listelemesi

68

find location -ctime time_period

Zaman_dönemi örnekleri:

  • 30 günden daha önce: -ctime +30

  • 30 günden daha az bir süre önce: -ctime -30

  • Tam 30 gün önce: -ctime 30


7
Sorun şu ki, belirli bir tarih için test etmek istiyorum, bir süre içinde değil.
sverrejoh

1
Kaç gün önce olduğunu anlayın ve bu sayıyı kullanın.
jmanning2k

15
ctimeoluşturma süresi ile hiçbir ilgisi yoktur , inode değiştirme zamanıdır.
Stephane Chazelas

47

Bu iki adım ama bunu bu şekilde yapmayı seviyorum:

Önce belirli bir tarih / saat içeren bir dosya oluşturun. Bu durumda, dosya gece yarısı 2008-10-01'dir

touch -t 0810010000 /tmp/t

Şimdi yukarıdaki dosyadan daha yeni veya daha eski olan tüm dosyaları bulabiliriz (dosya değiştirilme tarihine göre değişir.) -Anewer erişilebilir ve için -Cnewer değişti dosya durumu).

find / -newer /tmp/t
find / -not -newer /tmp/t

Dokunarak iki dosya oluşturarak belirli tarihler arasındaki dosyalara da bakabilirsiniz

touch -t 0810010000 /tmp/t1
touch -t 0810011000 /tmp/t2

Bu, iki tarih ve saat arasındaki dosyaları bulur

find / -newer /tmp/t1 -and -not -newer /tmp/t2

3
Eski bir çözümü için + 1 findyoksun-newerXY
Felipe Alvarez

1
IMO, şu anda bu kabul edilmiş çözüm olmalı. -Yeni çekirdekler hariç, 2.6.18-348.18.1.el5 çekirdeği üzerinde çalışmaya başlayamadım.
DarkForce

Aynı şekilde DarkForce, newermt işlevselliği çok çok sakat görünüyor
niken

34

Bunu yapabilirsin:

find ./ -type f -ls |grep '10 Sep'

Misal:

[root@pbx etc]# find /var/ -type f -ls | grep "Dec 24"
791235    4 -rw-r--r--   1 root     root           29 Dec 24 03:24 /var/lib/prelink/full
798227  288 -rw-r--r--   1 root     root       292323 Dec 24 23:53 /var/log/sa/sar24
797244  320 -rw-r--r--   1 root     root       321300 Dec 24 23:50 /var/log/sa/sa24

Çoğu insanın istediği budur, ancak yeterince oy almamıştır !!!
sjas

2
bu, bir dizinde birkaç milyon dosya bulundurmak için işe yaramayabilir.
Dennis Nolte

3
Grep arama terimi dosya adındaysa yan etkiler olabilir.
Snorex

mywiki.wooledge.org/ParsingLs - daha iyi bir yaklaşım, muhtemelen oluşturma tarihinizi makine tarafından okunabilir biçimde yazdırmaktır, belki de statyoksa find -printf.
tripleee

12

Yapamazsın. -C anahtarı izinlerin en son ne zaman değiştirildiğini, -a en son erişim süresini ve -m değişiklik süresini test eder. Linux'un pek çok çeşidi (ext3) tarafından kullanılan dosya sistemi bir "oluşturma zamanı" kaydını desteklemez. Afedersiniz!


7
Aslında, sadece dosya sistemi türü değildir - dosya sistemi tutsa bile, bu tür bilgileri elde etmek için bir sistem arayüzü yoktur. Unix'in en erken günlerine kadar olan eksikliklerinden biri, bu yüzden Unix'in asla başlamaması.
chrisdowney

1
Unix asla havalanmayacak mı?
lucid_dreamer

8

@ Maks: oluşturma zamanı hakkında doğru.

Eğer biri için geçen gün argüman hesaplamak istiyorsanız Ancak, -atime, -ctime, -mtimeparametreleri, aşağıdaki ifadeyi kullanabilirsiniz

ELAPSED_DAYS=$(( ( $(date +%s) - $(date -d '2008-09-24' +%s) ) / 60 / 60 / 24 - 1 ))

"2008-09-24" yerine istediğiniz tarihi girin; ELAPSED_DAYS, o zaman ile bugün arasındaki gün sayısına ayarlanacaktır. (Güncelleme: findtarih yuvarlamasıyla hizalamak için sonuçtan birini çıkarın .)

Bu nedenle, 24 Eylül 2008'de değiştirilen herhangi bir dosyayı bulmak için komut şöyle olacaktır:

find . -type f -mtime $(( ( $(date +%s) - $(date -d '2008-09-24' +%s) ) / 60 / 60 / 24 - 1 ))

Bu, sürümünüz @Arve: 'ın cevabında belirtilen tahminleri finddesteklemiyorsa -newerXYişe yarayacaktır.


2

Bulmak için -atime, -ctime ve -mtime anahtarlarıyla, elde etmek istediğiniz şeye yaklaşabilirsiniz.


-3
cp `ls -ltr | grep 'Jun 14' | perl -wne 's/^.*\s+(\S+)$/$1/; print $1 . "\n";'` /some_destination_dir

1
Dosyaları neden kopyalıyorsunuz? Eserlerdeki komutun yanı sıra aracı `ls ...`kullanmaz find.
Yamaneko

-5

Bu komut dosyasını 14 günden eski tüm dosyaları silen bir komut dosyasında buldum:

CNT=0
for i in $(find -type f -ctime +14); do
  ((CNT = CNT + 1))
  echo -n "." >> $PROGRESS
  rm -f $i
done
echo deleted $CNT files, done at $(date "+%H:%M:%S") >> $LOG

Ben biraz ek "adam bulmak" ve -ctime / -atime vb parametreleri arıyor burada size yardımcı olacağını düşünüyorum.

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.