Trong bash, làm thế nào tôi có thể đổi tên một tệp mà không lặp lại đường dẫn? [bản sao]


39

Có thể trùng lặp:
Sử dụng lại văn bản trên lệnh bash

Nếu tôi muốn đổi tên một tập tin sâu một vài thư mục, làm thế nào tôi có thể tránh lặp lại đường dẫn?

Ví dụ:

mv path/to/old_filename.txt path/to/new_filename.txt

Tôi tự hỏi nếu có một cách để làm điều này:

mv path/to/old_filename.txt (?)new_filename.txt

Trường hợp (?)sẽ là một số cách nói "trong cùng một thư mục."

Câu trả lời:


26

Sử dụng mở rộng lịch sử bash :

mv path/to/oldfile !#:1:h/newfile

trong đó !#:1:hcó nghĩa là: từ dòng bạn hiện đang gõ ("! #"), lấy từ đầu tiên (": 1"), sau đó chỉ lấy thành phần đường dẫn (": h" - phần đầu) từ nó.


Đây là gần nhất với những gì người hỏi ban đầu giả định giải pháp có thể, và rất hữu ích để biết, vì vậy +1.
crazy2be

2
Mát mẻ! Tôi nghĩ phương pháp mở rộng niềng răng của Darth dễ dàng hơn, nhưng đây chính xác là những gì tôi yêu cầu.
Nathan Long

Tôi đã học được hai điều mới tuyệt vời ngày hôm nay. Ngoài ra, tôi sẽ mãi mãi nghĩ về việc mở rộng niềng răng là "mở rộng niềng răng của Darth" bởi vì nó nghe thật tuyệt vời.
PileOfMush

62

Bạn có thể sử dụng mở rộng nẹp: mv path/to/{old_filename.txt,new_filename.txt}

Dưới đây là một liên kết đến hướng dẫn GNU về mở rộng dấu ngoặc trong shell bash, định nghĩa một danh sách các thay thế và bảo bash lặp lại tham số bằng cách sử dụng một thay thế khác nhau mỗi lần lặp lại.

Ví dụ,

a{b,c,dd,e}

sẽ được mở rộng thành

ab ac add ae

Nhắc nhở duy nhất là các lần lặp lại mở rộng phải có khả năng theo dõi nhau như các đối số cho chương trình đích.


5
Hoặc giữ nó ở mức tối thiểu : mv path/to/{old,new}_filename.txt. Điều này cũng giúp đảo ngược hoặc các loại gần với sự lặp lại của lệnh. Tôi đã thực hiện nhiều lần mv /etc/X11/xorg.conf{,.backup}, ví dụ , có thể đảo ngược quá trình bằng cách thay đổi đơn giản mv /etc/X11/xorg.conf{.backup,}.
Daniel Andersson

26

Câu trả lời của Darth ở trên rất thông minh, nhưng nếu bạn muốn sử dụng một cách tiếp cận cd, bạn cũng có thể cân nhắc sử dụng một lớp con:

(cd path/to && mv old_filename.txt new_filename.txt)

Vì thay đổi thư mục diễn ra trong lớp con, nên bạn sẽ không thực sự thay đổi thư mục trong vỏ tương tác của mình.


1
Hạn chế đáng kể: Bạn không thể sử dụng hoàn thành tab cho old_filename.txt.
bluenote10

9

Một cách khác hữu ích, nếu bạn định thực hiện một số lệnh trong thư mục, thì đây là:

pushd /path/to
mv oldfile newfile
...
popd

5

Tôi thích câu trả lời của @ Darth . Đây là một thay thế:cd path/to && mv oldfile newfile && cd -


1
Lưu ý nếu mvthất bại (ví dụ, không có quyền), bạn sẽ bị bỏ lại trong path/tothư mục. Bạn có thể cố gắng cd path/to && mv oldfile newfile ; cd -đảm bảo cd -luôn chạy, trừ khi cd path/to(không có quyền) thất bại, bạn vẫn sẽ thực thi cd -và chuyển đến thư mục trước đó không mong muốn. câu trả lời phụ mlc (+1) là tốt hơn. Tôi đoán cd . && cd path/to && mv oldfile newfile ; cd -sẽ hoạt động 99,9% thời gian ( cd .chỉ thất bại nếu bạn hoặc quyền truy cập thư mục hiện tại của bạn thay đổi; và trong trường hợp đó, việc chuyển sang một thư mục khác không phải là kết quả xấu.
dr jimbob
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.