Lengkapi file terbaru

13

Saya memiliki proses yang membuat file teks yang nama filenya didasarkan pada timestamp saat pembuatannya:

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

Bagaimana saya bisa melengkapi nama file file yang dibuat terbaru , yaitu file dengan mtime terbaru? Tidak ada cara untuk menggunakan Tab-completion untuk file-file ini karena hampir setiap karakter dalam nama file dibagi dengan file lain. Saya berharap menemukan jalan pintas (seperti Alt .yang secara otomatis melengkapi argumen terakhir dari perintah terakhir). Saya telah berhasil menyusun alias berikut yang besar untuk VIM, tapi aku akan senang untuk mengetahui apakah jalan pintas tujuan umum ada yang saya bisa menggunakan dengan kde-open, sqlite3, dan aplikasi lainnya.

alias lastest="vim `ls -t | grep -vE "^total [0-9]*$" | head -n1`"
dotancohen
sumber
Setelah membaca semua itu, pertanyaannya tampaknya belum memiliki jawaban yang memuaskan tentang cara memiliki pintasan keyboard untuk menyisipkan filepath terbaru (penyelesaian a la bash, dan mudah-mudahan, juga melihat urutan kronologis) di bash shell?
Roman Susi
@ RomanSusi: Jawaban terdekat ini adalah oleh Weidenrinde, tetapi hanya memasukkan literal $(ls -t|head -1)ke dalam garis. Karena itu, jangan bersepeda. Karena tidak ada jawaban yang memuaskan, saya menerima jawaban yang paling mengajari saya dan menyediakan utilitas paling banyak.
dotancohen
Tentu. Itu hanya terjadi pada saya itu bisa menjadi fitur shell keren, dan bertanya-tanya mengapa belum ada yang menerapkannya.
Roman Susi

Jawaban:

6

Hapus saja vimdari alias. Lakukan sesuatu seperti ini:

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

Anda kemudian dapat menggunakan program apa pun untuk membuka file terbaru:

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

dll.

Namun, ini akan pecah jika nama file Anda memiliki spasi atau karakter aneh yang mengapa Anda tidak boleh menguraikanls . Cara yang lebih baik adalah seperti ini (tambahkan ini ke Anda .bashrc):

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

Fungsi ini akan menjalankan perintah apa pun yang Anda berikan sebagai argumen dan meneruskan hasil findpanggilan (file terbaru) ke perintah itu. Jadi, Anda dapat melakukan hal-hal seperti:

latest emacs
latest less

Jika Anda harus dapat melakukan hal-hal seperti mv $(latest) foo/coba yang ini sebagai gantinya:

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
}

Kemudian, untuk menyalin file terbaru ke bar/ , Anda akan melakukannya

latest cp bar

Dan Anda masih bisa melakukannya latest emacsdengan cara yang sama seperti sebelumnya.

terdon
sumber
Terima kasih, ada beberapa hal yang bisa saya pelajari di sini.
dotancohen
Saya akan merekomendasikan alias latest='\ls -tr | tail -n 1'- ini akan berhasil jika Anda memiliki lsalias.
domen
5

Anda dapat dengan mudah mengkonfigurasi ini dizsh , misalnya dengan sesuatu seperti ini:

zstyle ':completion:*' file-sort date

(Anda juga dapat mengubah baris sehingga gaya ini hanya digunakan untuk pola nama file tertentu)

zsh sangat mirip dengan bash, Anda mungkin bisa menyebutnya superset dari bash - fitur- / penggunaan-bijaksana.

Tapi mungkin bash memiliki fitur serupa.

maxschlepzig
sumber
Terima kasih, ini bagus. Untuk beberapa alasan saya memilih untuk tidak pindah ke zshtetapi jika saya pernah melakukannya, saya memiliki bookmark ini!
dotancohen
Terima kasih telah memperkenalkan saya zsh!
dotancohen
3

Karena file terbaru juga diurutkan terakhir, Anda dapat menggunakan menu-complete-backward. menu-completedan menu-complete-backwardsiklus melalui penyelesaian atau masukkan penyelesaian pertama atau terakhir. Saya telah mengikat mereka ke tab opsi dan tab shift di ~/.inputrc:

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

Emulator terminal Anda mungkin tidak dimasukkan \e[Zsaat Anda menekan tab-geser. Gunakan C-vatau cat -vuntuk melihat teks apa yang dimasukkan saat Anda menekan kombinasi tombol.

Lri
sumber
Bahkan, file diurutkan secara alfabet, bukan secara kronologis. Jika saya mengetahui cara mengurutkan secara kronologis maka saya akan memperbarui dengan info.
dotancohen
2

Latar belakang untuk pertanyaan adalah kecepatan penggunaan. Saya menemukan makro keyboard yang paling tepat. Tambahkan ke ~/.inputrc:

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

Ide selanjutnya: Awalnya, saya menginginkan sesuatu yang memberi saya file terbaru ke-1, ke-2, ke-3. Suatu gagasan adalah, untuk menandai tempat dengan token, misalnya "grep x _", kemudian jalankan makro keyboard "\ C-alatest-expansion \ Cm" dan "ekspansi terbaru" meminta daftar pemilihan kutukan untuk memilih dari file terbaru untuk setiap token "_" di baris perintah.

Saya menganggap ini pertanyaan penting, karena satu kelebihan yang tersisa dari GUI dibandingkan SHELL adalah bagi saya pemilihan file dan direktori yang baru digunakan / dibuat. autojumpmembantu sedikit untuk direktori, solusi untuk file tidak ada.

Weidenrinde
sumber
Terima kasih, itu sangat membantu. Perhatikan bahwa itu memasukkan literal $(ls -t|head -1)ke dalam garis bash, jadi itu perlu ditafsirkan. Itu membuatnya kurang bermanfaat, tetapi itu masih trik yang bagus.
dotancohen