En yeni dosyayı otomatik tamamla


13

Dosya adları oluşturma anlarının zaman damgasına dayalı metin dosyaları oluşturan bir işlem var:

$ ls
1378971222.txt
1378971254.txt
1378971482.txt
1378971488.txt
1378972089.txt
1378972140.txt
1378972141.txt
1378972153.txt
1378972155.txt
1378972241.txt

En son oluşturulan dosyanın , yani en son mtime içeren dosyanın dosya adını nasıl otomatik olarak tamamlayabilirim ? Dosya adındaki hemen hemen her karakter başka bir dosyayla paylaşıldığından, bu dosyalar için Sekme tamamlamayı kullanmanın bir yolu yoktur. Bir kısayol ( Alt .umarım son komutun son argümanını otomatik olarak tamamlar) bulmayı umuyorum . Ben için harika aşağıdaki takma uydurmak başarmış VIM, ama genel amaçlı kısayol Birlikte kullanabileceği varsa bilmek isteriz kde-open, sqlite3ve diğer uygulamalar.

alias lastest="vim `ls -t | grep -vE "^total [0-9]*$" | head -n1`"


Tüm bunları okuduktan sonra, soru, bash kabuğuna en son dosya yolunu (la bash tamamlama ve umarım kronolojik sırayla geçiş) eklemek için bir klavye kısayolunun nasıl bulunacağı konusunda henüz tatmin edici bir cevabı yok gibi görünüyor?
Roman Susi

@RomanSusi: Bu en yakın cevap Weidenrinde'ye ait, ancak sadece bir değişmez $(ls -t|head -1)satır ekliyor . Bu nedenle, bisiklet yok. Tatmin edici bir cevap olmadığında, bana en çok öğreten ve en çok fayda sağlayan cevabı kabul ettim.
dotancohen

Elbette. Sadece havalı bir kabuk özelliği olabilirdi ve neden henüz kimsenin uygulamadığını merak etti.
Roman Susi

Yanıtlar:


6

Sadece vimtakma addan kaldırın . Bunun gibi bir şey yapın:

alias latest='ls -tr | tail -n 1'

Daha sonra en son dosyaları açmak için herhangi bir programı kullanabilirsiniz:

emacs `latest`
ls `latest`
mv `latest` ../

vb.

Ancak, dosya adlarınızda boşluklar veya garip karakterler varsa, bu nedenle asla ayrıştırmamalısınızls . Daha iyi bir yol böyle bir şey olurdu (bunu kendinize ekleyin .bashrc):

function latest(){
  $1 "$(find . -type f -printf "%C@ %p\n" | sort | tail -n 1 | cut -d " " -f 2-)"
}

Bu işlev, bağımsız değişken olarak verdiğiniz komutu çalıştırır ve findçağrının sonucunu (en son dosya) bu komuta iletir. Böylece, aşağıdakileri yapabilirsiniz:

latest emacs
latest less

mv $(latest) foo/Bunun yerine böyle bir şey yapabilmeniz gerekiyorsa :

function latest(){
   A=(${@})
   prog=$1;
   lat=$(find . -type f -printf "%C@ %p\n" | sort | tail -n 1 | cut -d " " -f 2-)
   if [ ! -z $2 ] ; then 
     args=${A[@]:1}; 
     $prog "$lat" "${A[@]:1}"
   else
     $prog "$lat"
   fi
}

Sonra, en son dosyayı kopyalamak için bar/, sen yapardın

latest cp bar

Ve hala latest emacseskisi gibi yapabilirsiniz.


Teşekkür ederim, burada öğrenebileceğim birkaç şey var.
dotancohen

Ben tavsiye ederim alias latest='\ls -tr | tail -n 1'- bu lstakma adı varsa işe yarayacak .
domen

6

Bunu , örneğin böyle bir şeyle kolayca yapılandırabilirsinizzsh :

zstyle ':completion:*' file-sort date

(satırı, bu stil yalnızca belirli dosya adı desenleri için kullanılacak şekilde değiştirebilirsiniz)

zsh bash'a çok benziyorsa, muhtemelen bash'ın süper özelliği olarak adlandırılabilir - özellik- / kullanım-bilge.

Ama belki de bash benzer bir özelliğe sahiptir.


Teşekkürler, bu harika. Birkaç nedenden ötürü taşınmamayı tercih ediyorum zshama eğer yaparsam, bu yer imi var!
dotancohen

Beni tanıştırdığın için teşekkürler zsh!
dotancohen

3

En yeni dosya da en son sıralandığı için kullanabilirsiniz menu-complete-backward. menu-completeve menu-complete-backwardtamamlamalar arasında geçiş yapabilir veya ilk veya son tamamlamayı ekleyebilirsiniz. Onları seçenek-sekmesine ve shift-sekmesine bağladım ~/.inputrc:

"\e\t": menu-complete
"\e[Z": menu-complete-backward

\e[ZShift-sekmesine bastığınızda terminal öykünücünüz takılmayabilir . Bir tuş bileşimine bastığınızda hangi metnin eklendiğini görmek için C-vveya tuşlarını kullanın cat -v.


Aslında, dosyalar kronolojik olarak değil, alfabetik olarak sıralanır. Kronolojik olarak nasıl sıralanacağımı anlarsam bilgilerle güncelleyeceğim.
dotancohen

2

Sorunun arka planı kullanım hızıdır. En uygun klavye makrosunu buluyorum. Şuraya ekle ~/.inputrc:

# Alt-L --> newest file in directory
"\el": "$(ls -t|head -1)"

Diğer fikirler: Başlangıçta bana 1., 2., 3. en yeni dosyayı veren bir şey istedim. Bir fikir, yerleri bir jetonla işaretlemek, örneğin "grep x _", ardından "\ C-alatest-expanding \ Cm" klavye makrosunu çalıştırmak ve "en son genişletme", bir seçim listesi listesinden seçim yapmanızı ister. komut satırındaki her "_" belirteci için en son dosyalar.

Bunu önemli bir soru olarak görüyorum, çünkü GUI'nin SHELL'e göre kalan bir avantajı benim için son kullanılan / oluşturulan dosya ve dizinlerin seçimi. autojumpdizinler için biraz yardımcı olur, dosyalar için bir çözüm eksik.


Teşekkür ederim, bu yardımcı olur. $(ls -t|head -1)Bash satırına bir değişmez eklediğine dikkat edin , bu yüzden yorumlanması gerekir. Bu daha az kullanışlı hale getirir, ancak yine de güzel bir hile.
dotancohen
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.