Son n saniyede değişen dosyaları bulmak için Linux komutu


19

Son nsaniyede değişen dosyaları bulmak için bir Linux komutu istiyorum .

Komut satırı arabiriminden veya GUI'den çalıştırabileceğim bir kabuk komut dosyası veya başka bir araç var mı?

Yanıtlar:


14

Find komutunu şu şekilde kullanın:

find . -name "*.txt" -mtime -60s

*.txtSon 60 saniyede değiştirilen tüm dosyaları bulmak için .


17
(GNU 4.4.2 findutils itibaren) Linux kullanımında, bul kullanarak, bu komutla bir hata alıyorum: find: missing argument to `-mtime'. Ancak, -mmin ve ondalık bağımsız değişken kullanarak istenen davranışı elde edebilirsiniz. sBir argüman olarak kullanmak için manpagede herhangi bir referans bulamadım .
dr jimbob

4
-60s geçerli bir argüman değil -mtime. "60'lar" da POSIX veya GNU bulmasında geçerli bir seçenek değildir. To argümanı -mtime, bir dosyanın değiştirildiği 24 saatlik dönem sayısını belirten bir sayıdır.
dannysauer

13

Saniye belirten mtime ile çözümfind --version == kullanan linux sistemlerim üzerinde çalışmıyor find (GNU findutils) 4.4.2.

Aşağıdaki hatayı alıyorum:

mycomputer:~/new$ find . -mtime -60s
find: missing argument to `-mtime'
mycomputer:~/new$ find . -mtime -60seconds
find: missing argument to `-mtime'

Ancak, -mmin(son m dakika içinde değiştirildi için) kullanabilir ve ondalık bir bağımsız değişken alabilir; örneğin, son 30 saniyede değiştirilen dosyaları bulur.

find . -mmin 0.5

Yani mesela; son 120 saniye içinde en son değiştirilen 1s, 6s, 11s, ... dosyalarının oluşturulması, bu komutun bulduğu:

mycomputer:~/new$ for i in $(seq 1 5 120); do touch -d "-$i seconds" last_modified_${i}_seconds_ago ; done
mycomputer:~/new$ find . -mmin 0.5
.
./last_modified_1_seconds_ago
./last_modified_26_seconds_ago
./last_modified_11_seconds_ago
./last_modified_16_seconds_ago
./last_modified_21_seconds_ago
./last_modified_6_seconds_ago

Yani saniyeler içinde gerçekten ihtiyacınız varsa, şöyle bir şey yapabilirsiniz:

localhost:~/new$ for i in $(seq 1 1 120); do touch -d "-$i seconds" last_modified_${i}_seconds_ago ; done
localhost:~/new$ N=18; find . -mmin $(echo "$N/60"|bc -l)
./last_modified_1_seconds_ago
./last_modified_9_seconds_ago
./last_modified_14_seconds_ago
./last_modified_4_seconds_ago
./last_modified_12_seconds_ago
./last_modified_13_seconds_ago
./last_modified_8_seconds_ago
./last_modified_3_seconds_ago
./last_modified_5_seconds_ago
./last_modified_11_seconds_ago
./last_modified_17_seconds_ago
./last_modified_16_seconds_ago
./last_modified_7_seconds_ago
./last_modified_15_seconds_ago
./last_modified_10_seconds_ago
./last_modified_6_seconds_ago
./last_modified_2_seconds_ago

8

Glenn'in önerdiğine benzer şekilde, örneğin bir yükleyici işleminin yürütüldüğü sırada değiştirilmiş her şeyi bulmak istiyorsanız, aşağıdaki gibi bir şey yapmak daha kolay olabilir:

touch /tmp/checkpoint
<do installer stuff>
find / -newer /tmp/checkpoint

O zaman zaman hesaplamasını yapmak zorunda değilsiniz; sadece kontrol noktası dosyasından sonra değişen şeyleri bulabilirsiniz.


6

Desteklemeyen -mtime -60sbir bulma sürümünüz varsa, daha iyi bir çözüm

touch -d '-60 seconds' /tmp/newerthan
find . -name "*.txt" -newer /tmp/newerthan

6

Bunu yapmanın en basit yolu:

find . -name "*.txt" -newermt '6 seconds ago'

-mtime -60sBirçok sürümlerinde çalışmaz bir cevapta belirtildiği seçenek, findhatta 2016 yılında, -newermtbizim için çok daha iyi bir seçenektir. Birçok farklı tarih ve saat biçimini ayrıştırabilir.

Kullanmanın alternatif bir yöntemi mminşudur:

find . -name "*.txt" -mmin -0.5

# Finds files modified within the last 0.5 minute, i.e. last 30 seconds

Bu seçenek tüm findsürümlerde çalışmayabilir .


2
Bu açıkça en iyi çözümdür.
rednoah


1

Sürümünüz findsanki benimki gibi saniyeler veya gerçek değerleri kabul etmiyorsa kullanın -mmin, ancak 0'ı belirtin ve tüm dosyaları bir dakikadan daha kısa sürede değiştirin:

$ touch test; find . -type f -mmin 0
./test
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.