Bir bash glob'dan sadece bir sonuç seçebilir miyim?


14

Bir çıktı üzerinde bazı raporlama otomatikleştirmek için iş için bir komut dosyası yazmaya çalışıyorum. Günlük dosyaları (şu anda, gelecekte 'standartlaştırılıyor') bu tür yol yapısında saklanmaktadır:

/<root_path>/<process_one_path>/logs/<time_date_stamp>/<specific_log_file>

/<root_path>/<process_two_path>/logs/<different_time_date_stamp>/<specific_log_file>

Yolun her bölümü, her zaman klasörde en son olan saat tarihi damgaları dışında bilinir.

Zaman tarih damgası yerine joker bir kart kullanmaya çalışırsam birden fazla sonuç alırım, örneğin:

> ls /<root_path>/<process_two_path>/logs/* [tab]
20130102-175103
20130118-090859
20130305-213506

Sadece en sonuncuyu döndürmesini istiyorum, bu Bash ile mümkün mü?

NB (Zsh'ım yok ve kulağa hoş geldiği için hiç işten alacağımızdan şüpheliyim)

Yanıtlar:


9

Bash 4.2'de aşağıdakiler çalışır:

list=( /<root_path>/<process_two_path>/logs/* )
echo "${list[-1]}"

Bash'iniz daha eski bir sürümse:

list=( /<root_path>/<process_two_path>/logs/* )
echo "${list[${#list[@]}-1]}"

Bu kesinlikle ev bilgisayarımda çalışıyor ancak iş yerinde çalışacağını garanti edemiyorum?
Pureferret

@ Çalışmayabilecek parçanın negatif dizi dizinidir ( -1). Bu, bash 4.2'de eklenmiştir. RHEL5 muhtemelen mevcut en eski desteklenen ana dağıtımdır ve 4.2.20 bash kullanır.
Patrick

1
Eski sürümleri bash: "${list[@]: -1}"like in ksh93( [-1]from from zsh).
Stéphane Chazelas

@Patrick - RHEL5 bash kullanır 3.2. RHEL 3 ve 4 hala uzun ömürlüdür.
jordanm

1
@Pureferret Ayrıca dizi uzunluğu ile aritmetik yapabilirsiniz, benim düzenleme bakın.
Gilles 'SO- kötü olmayı bırak'

10

POSIXly:

 set -- /<root_path>/<process_two_path>/logs/*
 shift "$(($# - 1))"
 printf '%s\n' "$1"

Bahsettiğinizden beri zsh:

 print -r /<root_path>/<process_two_path>/logs/*([-1])

4

Döngü için bir bash içinde bash glob kullanın. Bunun gibi:

for filename in <logdir>/*; do :; done; echo "$filename"

Bu, bash'ın glob genişlemesini alfabetik olarak sıraladığı gerçeğine bağlıdır. Daha fazla bilgi için bash kılavuzunu okuyun . Bunun LC_COLLATE tarihine bağlı olduğunu unutmayın . Bu aynı zamanda değişkeninfilename döngü sona erdikten sonra hala son değeri içermesine .

Dosya adının en eski zaman damgasına sahip olmasını istiyorsanız, bunu şu şekilde yapabilirsiniz:

for filename in <logdir>/*; do echo "$filename"; break; done

1

Boru hatlarında -1 varsayılan değerdir ve ls çıkışı zaten sıralanmalıdır:

ls | tail -n1

Diğerleri ilk veya son sonucun etkileşimli olarak nasıl ekleneceğini arıyorsa, .inputrc içinde menu-complete veya menu-complete-geriye doğru bağlanabilirsiniz:

"\e\t": menu-complete
"\e[Z": menu-complete-backward # shift-tab

Tümü belirsizse göster etkinse, set completion-query-items 0101 veya daha fazla sonuç olduğunda istemi kaldırır set page-completions offve çağrı cihazını devre dışı bırakır.


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.