Các tập tin cp hoặc mv vào cùng một thư mục mà họ đã ở khi tôi ở trong một thư mục khác?


12

Nếu tôi đang ở ~/blobvà tôi có một tập tin trong~/blob/a_long_directory_name/c/x.x

Tôi có thể gõ

mv blob/a_long_directory_name/c/x.x blob/a_long_directory_name/even_more/y.y

Có lối tắt nào để tôi có thể nhập một cái gì đó ngắn hơn sử dụng đường dẫn thư mục trong param đầu tiên (không phải thư mục hiện tại của tôi), vd

mv blob/a_long_directory_name/c/x.x $same_dir/y.y

nơi một cái gì đó như $same_dirsẽ chỉ đến thư mục của param 1

Câu trả lời:


8

Để giảm thiểu số lượng gõ, có thể dễ dàng nhất để thực hiện theo hai bước. CD vào thư mục, sau đó di chuyển.

Nếu bạn chỉ có một lệnh, bạn có thể sử dụng một lớp con:

$ (cd blob/a_long_directory_name/c/ && mv x.x y.y )

Điều đó có nghĩa là ý cdchí chỉ có hiệu lực trong lớp con, ý mvchí chỉ xảy ra nếu cdthành công và thư mục làm việc của trình bao hiện tại của bạn sẽ không thay đổi.

Nếu bạn có nhiều hơn một lệnh, sử dụng ngăn xếp thư mục.

$ pushd blob/a_long_directory_name/c/
$ mv x.x y.y
$ mv z.z q.q
$ popd

Điều này không giải quyết even_moređường dẫn tương đối ...
Vô dụng

Đúng rồi. Ví dụ $ same_dir dường như cũng bỏ qua nó.
Alan Shutko

+1 tôi thích nó Rất dễ nhớ và làm và đó là chìa khóa đối với tôi
Michael Durrant

Thật thú vị, vì nó không làm những gì bạn yêu cầu. Có lẽ câu hỏi của bạn không chính xác những gì bạn dự định?
Vô dụng

Vô dụng, tôi đã cập nhật tiêu đề của mình để làm rõ rằng đó là về các tệp cp / mv và giữ chúng trong cùng một thư mục, mặc dù tôi đang ở trong một thư mục khác. btw tên người dùng của bạn thật dễ thương nhưng nó khiến nhận xét trông thật ngớ ngẩn khi được sử dụng trong đó :)
Michael Durrant


5

Bạn có thể sử dụng khả năng thay thế văn bản của shell của bạn. Trong bash, bạn có thể sử dụng một con thú như:

mv blob/a_long_directory_name/c/xx !#:$:gs^c/xx^evenmore/yy

Để phá vỡ nó:

!# là dòng hiện tại được gõ cho đến nay

:$yêu cầu chọn từ cuối cùng (thay thế bằng một số nđể chọn ntừ thứ ') của chuỗi đang xem xét ( !#trong trường hợp này). Từ cuối cùng của dòng được gõ cho đến nay sẽ là từ trước đó.

:gs^xx^yykhông gthay thế văn bản toàn cầu ( ) strên từ kết quả, thay thế 'xx' bằng 'yy'. ^chỉ là một dấu phân cách cho slệnh để cho phép sử dụng /trong các mẫu của bạn.

Phương pháp này hơi chung chung hơn vì nó cho phép bạn thay thế bất kỳ phần nào của đường dẫn ('xx') bằng bất kỳ từ nào khác ('yy').

Cuối cùng, giống như với bất kỳ thao tác lịch sử nào, thật tốt khi có các tùy chọn vỏ thích hợp được đặt (ví dụ: trong ~/.bashrc). Trong trường hợp này

shopt -s histverify

sẽ hiển thị dòng đã chỉnh sửa sau khi bạn nhấn return, vì vậy bạn vẫn có thể chỉnh sửa nó và kiểm tra lỗi.

Tại sao bạn không sử dụng cấu trúc như vậy tôi không chắc, nhưng nó hoạt động trong trường hợp này.


a) Quá nhiều nhiễu đường truyền (so với mở rộng nẹp thanh lịch) b) Không giải quyết được vấn đề của OP: họ muốn thay thế c/x.xbằng cách evenmore/y.ygiữ tiền tố đường dẫn gốc.
Joseph R.

Nhận xét thứ hai của bạn là một thiếu sót đơn giản về phía tôi, yêu cầu chỉnh sửa đơn giản để khắc phục. Tôi không thấy câu trả lời này xứng đáng như thế nào. Với chỉnh sửa (tính kỹ thuật), nó giải quyết vấn đề và tổng quát hơn vì nó cho phép hoán đổi bất kỳ phần nào của đường dẫn (tôi thường sử dụng một cái gì đó tương tự $PWD). Chắc chắn, có thể nó không phải là thanh lịch nhất nhưng nó chỉ ra thực tế rằng shell không có sự thay thế văn bản và từ chỉ định văn bản, mà một số người dùng vẫn có thể thấy hữu ích để nghiên cứu.
Wojtek Rzepala

ĐỒNG Ý. Tôi đứng sửa.
Joseph R.
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.