Son n
saniyede 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ı?
Son n
saniyede 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:
Find komutunu şu şekilde kullanın:
find . -name "*.txt" -mtime -60s
*.txt
Son 60 saniyede değiştirilen tüm dosyaları bulmak için .
-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.
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
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.
Bunu yapmanın en basit yolu:
find . -name "*.txt" -newermt '6 seconds ago'
-mtime -60s
Birçok sürümlerinde çalışmaz bir cevapta belirtildiği seçenek, find
hatta 2016 yılında, -newermt
bizim 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 find
sürümlerde çalışmayabilir .
Dosyalarda yapılan değişiklikler için bir dizini izliyorsanız, muhtemelen sonsuz bir yoklama döngüsü yerine inotify araçlarını kullanmak istersiniz .
find: missing argument to `-mtime'
. Ancak, -mmin ve ondalık bağımsız değişken kullanarak istenen davranışı elde edebilirsiniz.s
Bir argüman olarak kullanmak için manpagede herhangi bir referans bulamadım .