Tự động hoàn tất tệp mới nhất


13

Tôi có một quy trình tạo các tệp văn bản có tên tệp dựa trên dấu thời gian của thời điểm tạo:

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

Làm cách nào tôi có thể tự động hoàn thành tên tệp của tệp được tạo mới nhất , tức là tệp có mtime mới nhất? Không có cách nào để sử dụng hoàn thành Tab cho các tệp này vì hầu hết mọi ký tự trong tên tệp được chia sẻ với tệp khác. Tôi hy vọng tìm thấy một lối tắt (chẳng hạn như Alt .tự động hoàn thành đối số cuối cùng của lệnh cuối cùng). Tôi đã cố gắng pha trộn lại cho bí danh sau đó là rất tốt cho VIM, nhưng tôi rất thích biết nếu một phím tắt có mục đích chung tồn tại mà tôi có thể sử dụng với kde-open, sqlite3và các ứng dụng khác.

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


Đọc xong tất cả, câu hỏi dường như chưa có câu trả lời thỏa đáng nào về cách có một phím tắt để chèn filepath mới nhất (hoàn thành la bash, và hy vọng, cũng xoay vòng theo thứ tự thời gian) trong vỏ bash?
Roman Susi

@RomanSusi: Câu trả lời gần nhất này là của Weidenrinde, nhưng nó chỉ chèn một chữ $(ls -t|head -1)vào dòng. Do đó, không đi xe đạp. Không có câu trả lời thỏa đáng, tôi chấp nhận câu trả lời dạy tôi nhiều nhất và cung cấp nhiều tiện ích nhất.
dotancohen

Chắc chắn rồi. Nó chỉ xảy ra với tôi nó có thể là một tính năng vỏ tuyệt vời, và tự hỏi tại sao không ai thực hiện nó.
Roman Susi

Câu trả lời:


6

Chỉ cần loại bỏ vimkhỏi bí danh. Làm một cái gì đó như thế này:

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

Sau đó, bạn có thể sử dụng bất kỳ chương trình nào để mở các tệp mới nhất:

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

Vân vân.

Tuy nhiên, điều này sẽ phá vỡ nếu tên tệp của bạn có khoảng trắng hoặc ký tự lạ, đó là lý do tại sao bạn không bao giờ nên phân tích cú phápls . Một cách tốt hơn sẽ là một cái gì đó như thế này (thêm cái này vào của bạn .bashrc):

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

Hàm này sẽ thực thi bất kỳ lệnh nào bạn đưa ra làm đối số và chuyển kết quả của lệnh findgọi (tệp mới nhất) cho lệnh đó. Vì vậy, bạn có thể làm những việc như:

latest emacs
latest less

Nếu bạn cần có khả năng làm những việc như mv $(latest) foo/thử cái này thay thế:

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
}

Sau đó, để sao chép tệp mới nhất vào bar/, bạn sẽ làm

latest cp bar

Và bạn vẫn có thể làm latest emacstheo cách tương tự như trước đây.


Cảm ơn bạn, có khá nhiều điều mà tôi có thể học ở đây.
dotancohen

Tôi muốn giới thiệu alias latest='\ls -tr | tail -n 1'- điều này sẽ hoạt động nếu bạn có lsbí danh.
Domen

5

Bạn có thể dễ dàng cấu hình cái này trongzsh , ví dụ như với cái gì đó như thế này:

zstyle ':completion:*' file-sort date

(bạn cũng có thể thay đổi dòng sao cho kiểu này chỉ được sử dụng cho các mẫu tên tệp nhất định)

zsh rất giống với bash, bạn có thể gọi nó là siêu bash - tính năng- / cách sử dụng-khôn ngoan.

Nhưng có lẽ bash có một tính năng tương tự.


Cảm ơn, điều này thật tuyệt. Vì một vài lý do tôi không muốn chuyển đến zshnhưng nếu tôi từng làm thế, tôi đã đánh dấu trang này!
dotancohen

Cảm ơn bạn đã giới thiệu cho tôi zsh!
dotancohen

3

Vì tệp mới nhất cũng được sắp xếp sau cùng, bạn có thể sử dụng menu-complete-backward. menu-completemenu-complete-backwardchu kỳ thông qua hoàn thành hoặc chèn hoàn thành đầu tiên hoặc cuối cùng. Tôi đã ràng buộc chúng với tab tùy chọn và tab shift trong ~/.inputrc:

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

Trình giả lập thiết bị đầu cuối của bạn có thể không chèn \e[Zkhi bạn nhấn phím shift. Sử dụng C-vhoặc cat -vđể xem văn bản nào được chèn khi bạn nhấn tổ hợp phím.


Trong thực tế, các tập tin được sắp xếp theo thứ tự abc, không theo thứ tự thời gian. Nếu tôi tìm ra cách sắp xếp theo thứ tự thời gian thì tôi sẽ cập nhật với thông tin.
dotancohen

2

Nền tảng cho câu hỏi là tốc độ sử dụng. Tôi tìm thấy một macro bàn phím thích hợp nhất. Thêm vào ~/.inputrc:

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

Ý tưởng khác: Ban đầu, tôi muốn một cái gì đó cung cấp cho tôi tệp mới nhất thứ 1, 2, 3. Một ý tưởng sẽ là, để đánh dấu các vị trí bằng mã thông báo, ví dụ: "grep x _", sau đó thực thi macro bàn phím "\ C-alatest-extend \ Cm" và "bản mở rộng mới nhất" nhắc danh sách lựa chọn lời nguyền các tệp mới nhất cho mỗi mã thông báo "_" trong dòng lệnh.

Tôi coi đây là một câu hỏi quan trọng, bởi vì một lợi thế còn lại của GUI so với SHELL là cho tôi lựa chọn các tệp và thư mục được sử dụng / tạo gần đây. autojumpgiúp một chút cho các thư mục, một giải pháp cho các tập tin bị thiếu.


Cảm ơn bạn, đó là hữu ích. Lưu ý rằng nó chèn một chữ $(ls -t|head -1)vào dòng bash, vì vậy nó cần được giải thích. Điều đó làm cho nó ít hữu ích hơn, nhưng nó vẫn là một mẹo hay.
dotancohen
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.