Lệnh Bash để sao chép trước con trỏ và dán sau?


24

Tôi không chắc làm thế nào để từ này, nhưng tôi thường thấy mình gõ các lệnh như thế này:

cp /etc/prog/dir1/myconfig.yml /etc/prog/dir1/myconfig.yml.bak

Tôi thường chỉ cần gõ đường dẫn hai lần (với hoàn thành tab) hoặc tôi sẽ sao chép và dán đường dẫn bằng con trỏ. Có một số bashfoo làm cho điều này dễ dàng hơn để gõ?


2
Tôi nghĩ bạn có nghĩa là bash-fu:)
con mèo

Câu trả lời:


43

Tôi nghĩ có một số mánh khóe (có một bản sao được tìm thấy trùng lặp), nhưng đối với điều này tôi có xu hướng làm

cp /etc/prog/dir1/myconfig.yml{,.bak}

được mở rộng để chỉ huy của bạn.

Điều này được gọi là mở rộng cú đúp . Trong biểu mẫu được sử dụng ở đây, {}biểu thức chỉ định một số chuỗi được phân tách bằng dấu phẩy. Chúng lần lượt "mở rộng" toàn bộ /etc/prog/dir1/myconfig.yml{,.bak}biểu thức, thay thế từng {}phần bằng từng chuỗi: chuỗi rỗng, cho /etc/prog/dir1/myconfig.yml, và sau đó .bak, cho /etc/prog/dir1/myconfig.yml.bak. Kết quả là

cp /etc/prog/dir1/myconfig.yml /etc/prog/dir1/myconfig.yml.bak

Các biểu thức này có thể được lồng nhau:

echo a{b,c,d{e,f,g}}

sản xuất

ab ac ade adf adg

Có một biến thể sử dụng số để tạo ra các chuỗi:

echo {1..10}

sản xuất

1 2 3 4 5 6 7 8 9 10

và bạn cũng có thể chỉ định bước:

echo {0..10..5}

sản xuất

0 5 10

chết tiệt thật ngọt ngào Tôi hình dung mình không phải là người đầu tiên hỏi, chỉ là một câu hỏi khó.
dùng1028270

Dấu phẩy làm gì ở đó?
dùng1028270

5
Xem Brace Expansion trong hướng dẫn: nó phân tách các giá trị được sử dụng trong việc mở rộng. Ở đây hai giá trị là chuỗi rỗng và .bak.
Stephen Kitt

12

Mở rộng lịch sử có thể hữu ích cho loại điều này (giả sử lịch sử bash được bật).

Trong ví dụ của bạn, bạn có thể làm:

cp /etc/prog/dir1/myconfig.yml !#:1.bak

Ở đây, tham chiếu !#đến dòng hiện tại, !#:1đề cập đến tham số 1 trên dòng hiện tại
!#:1.bakđề cập đến tham số 1 trên dòng hiện tại với '.bak' được xử lý ở cuối.

Khi bạn đã nhập công cụ xác định lịch sử, bạn có thể sử dụng Ctrl+ Alt+ Eđể mở rộng nó thành giá trị thực của nó nếu bạn muốn kiểm tra lại hoặc sửa đổi tên tệp.

Phần "Mở rộng lịch sử" trong các trang bash man có thêm thông tin.


8

Tương tự như câu trả lời của progo, nhưng có phần đơn giản hơn: C-wcắt (từ giết chết) từ bên trái của con trỏ, C-ychèn lại (chèn yanks lỗi) một lần nữa.

$ cp /etc/dir1/myconfig.yml                              (C-w)
$ cp                                                     (C-y)
$ cp /etc/dir1/myconfig.yml                              (space, C-y)
$ cp /etc/dir1/myconfig.yml /etc/dir1/myconfig.yml       (finish text)
$ cp /etc/dir1/myconfig.yml /etc/dir1/myconfig.yml.bak

2
Cũng đáng lưu ý rằng bạn có thể làm điều này với nhiều từ liên tiếp (ví dụ: nếu tên tệp của bạn có khoảng trắng) và Cy sẽ dán tất cả chúng, miễn là bạn chưa di chuyển con trỏ hoặc gõ bất cứ thứ gì khác vào giữa. Bất kỳ sự pha trộn nào của các lệnh xóa trừ việc xóa một ký tự (ví dụ: backspace / del / ctrl-d) đều hoạt động với điều này.
Random832

6

Bạn cũng có thể thực sự cắt-dán (kill-yank trong các điều khoản emacs / bash) từ dòng lệnh đến các phần trùng lặp để chỉnh sửa.

M-dgiết chết về phía trước cho đến khi ranh giới từ và bạn có thể giết văn bản nhiều lần và tất cả chúng được nối với nhau thành một 'dán' để kéo dài. Tiện lợi!

Yank tất cả điều này trở lại dòng lệnh tại con trỏ bằng C-y. Vì vậy, nếu bạn có một dòng như thế này (phần tử khối █ biểu thị vị trí con trỏ):

$ cp avb.txt                 (M-b M-b)
$ cpavb.txt                  (M-d) kill the word 'avb'
$ cp █.txt                    (C-y) yank it back
$ cp avb█.txt                 (C-e) to the end of line
$ cp avb.txt                 (C-y) yank it again
$ cp avb.txt avb             finish the line
$ cp avb.txt avb.foo

Dù bằng cách nào bạn thích làm điều đó, làm quen với những gì bash cung cấp trong bộ phận quan trọng tương tác sẽ có lợi. http://web.mit.edu/gnu/doc/html/features_7.html


6

Trong tcshhoặc zsh, Alt+Ctrl+_trong emacschế độ ( copy-prev-wordwidget) chèn từ cuối cùng, vì vậy

cp rất dài đường Alt+Ctrl+_.back

bashcó một copy-backward-wordtiện ích (không bị ràng buộc với bất kỳ khóa nào theo mặc định) nhưng chỉ sao chép từ đó vào bộ đệm vòng, bạn cũng cần nhấn Ctrl-Y(trong emacschế độ) để kéo nó. Nhưng bạn có thể làm:

bind '"\e[cpw~": copy-backward-word'
bind '"\e\C-_": "\e[cpw~\C-Y"'

Để Alt+Ctrl+_thực hiện cả sao chép / snarf và dán / yank như trong tcsh/ zsh.

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.