Dosya mevcut olana kadar bir komut dosyasında döngü


3

Bir betiğin sleep.txt adlı / tmp içindeki bir dosyayı bulmasını sağlamaya çalışıyorum ama bunun yerine döngü devam ediyor

İşte ne var:

#!/bin/sh

set -x
until [ $(ls -la | grep -w "sleep.txt" | wc -l) != 0 ];
do
        echo "Sleep.txt doesn't exist as of yet..."
done
        echo "Sleep.txt now exists!!!"
        sleep 2
exit

1
Linux kullanıyorsanız, dosya oluşumunu izlemek daha iyi olacaktır inotifywait.
John1024,

@ John1024 Kolayca bash betiğinde kullanılabilir mi?
Xen2050,

@ Xen2050 Evet, komut dosyası yazmak oldukça kolaydır. Bir örnekle bir cevap ekledim.
John1024,

Yanıtlar:


8

Bu komut dosyası yoklama kullanmaz. Başka bir deyişle, periyodik kontroller yapmaz. Bunun yerine, inotifywaitdosya sistemindeki değişiklikleri izlemek için tasarlanmış bir araç kullanır .

Bu komut dosyasında, inotifywaitgeçerli dizini ( .) izler . Bir dosya bu dizinde her oluşturulduğunda inotifywait, adını yayar ve komut dosyası eşleşip eşleşmediğini kontrol eder sleep.txt. Eğer öyleyse, yaratılışını duyurur:

[ -e sleep.txt ] || while IFS= read -r fname
do_
    [ "$fname" = sleep.txt ] && break
done < <(inotifywait -m -q -e create -e moved_to --format %f .)

echo "Finally, sleep.txt now exists!!!"

Daha fazla detay

Kullanılan seçenekler inotifywaitşu anlama gelir:

  • -mdizini izlemeye devam etmek demektir. Başka bir deyişle, rapor edilmeye değer bir şey olduğunda ilk kez durmayın.

  • -q normalden daha sessiz olması demektir.

  • -e create -e moved_to sadece bu dizinde oluşturulan veya taşınan dosya hakkında rapor anlamına gelir.

  • --format %f her dosya oluşturma olayı gerçekleştiğinde dosya adını yazdırmasını söyler

  • .hangi dizinin izleneceğini söyler. Bir süre, .her zaman geçerli dizini ifade eder.

yükleme inotifywait

Debian benzeri sistemlerde, inotifywaitaşağıdakilerin bir parçası inotify-toolsve yüklenebilir:

apt-get install inotify-tools

MS Windows ve OSX

inotifywait Linux sistemlerinde kullanılabilir ve aynı zamanda Cygwin altında çalışır.

Windows için benzer araçları okumak için burayı tıklayın .

Mac OSX'te benzer araçlar hakkında bilgi için, buraya tıklayın .


Mükemmel cevap! Daha fazla metin eklemek mi istediniz? Son cümle eksik.
Edward

@Edward Teşekkürler. Bu başıboş kelimeyi kaldırdım.
John1024

2
+1 Görünüşe göre pakete ihtiyacı var inotify-tools, en azından Linux Nane'de, inotify çekirdeğin bir parçası olmasına rağmen. Ve inotifywait komut dosyası çıktıktan bir süre sonra çalışmaya devam eder, dizinde başka bir dosya oluşturmaya kadar en az bir dakika ... başka bir terminalde pgrep ile test edilir.
Xen2050

1
@ Xen2050 Evet, debian aynı: apt-get install inotify-tools.
John1024

1
@mpy Teşekkürler! (i) Evet, işlem değişikliği POSIX değil. Bash altında çalışacaktır (bu soru bash olarak etiketlenmiştir), zsh ve ksh {88,93}. İşlem değiştirme kullanmıyorsanız, bir boru hattı kullanmak istiyorsunuz ve böyle bir durumda, bunun kendi sorunları var. (ii) Evet, sleep.txtzaten mevcutsa, silinmesi ve yeniden yaratılması için bu bekleyecektir. Bu bir problemse, döngüden önce bir test eklemeliyim. (iii) Inotifywait'in Linux ile sınırlı olduğunu düşünmüştüm. Bunun Cygwin'de de çalıştığını duyduğuma sevindim. (Diğer işletim sistemlerinin de benzer özelliklere sahip olmasını bekliyorum.)
John1024

6

Ayrıştırma ls iyi bir fikir değildir .

Bunun yerine, -ebir dosyanın olup olmadığını kontrol etmek için testi kullanabilirsiniz :

#!/bin/sh

until [ -e sleep.txt ]; do
    echo "sleep.txt doesn't exist as of yet..."
    sleep 1
done

echo "sleep.txt now exists!!!"
sleep 2

Komut man testhakkında daha fazla bilgi için danışın test.


1
Sadece küçük bir açıklama: [[Eğer için shebang hattını değiştirmek isteyebilirsiniz ya yüzden Bash özeldir #!/bin/bashveya tek parantez çift parantez yerine [ve ]. (Ayrıca, girinti biraz kafa karıştırıcıdır.)
Edward

1
Q, "bash" olarak etiketlendi, ancak kafa karıştırıcı bir şekilde OP kullanıyor /bin/sh...
Xen2050

@Edward: Cevabımı puanlarınıza göre geliştirdim. Ancak emin değilim [[ ... ]]. Çalışmaya görünüyor shda, ama nasıl bağlı olabilir antik sh;)
mpy
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.