Cách nhanh nhất để đổi tên tệp mà không cần gõ lại đường dẫn thư mục


56

Tôi biết cách đổi tên các tệp trong Unix:

$ mv ~/folder/subfolder/file.txt ~/folder/subfolder/file.sh

     ^-------this part------^    ^------this part-------^

Phải mất quá nhiều thời gian để lặp lại ~/folder/subfolder/filehai lần.

Có cách nào nhanh hơn không?

Câu trả lời:


104

Nếu vỏ của bạn được hỗ trợ Brace Expansion (chỉ hoạt động với csh, tcsh, ksh, zsh, bash, mksh, lksh, pdksh, yashvới cú đúp-expand kích hoạt bằng cách gọi yash --brace-expandhoặc đặt trong vỏ interative với set -o brace-expand, hoặc fish):

mv ~/folder/subfolder/file.{txt,sh}

4
đơn giản là điều tốt nhất!
Braiam

2
sử dụng tuyệt vời của mở rộng trong vỏ rực rỡ!
harish.venkat

3
tuyệt vời, nhưng thực sự khó hiểu. Nó hoạt động nhưng thoạt nhìn tôi sẽ nghĩ nó làm một cái gì đó khác biệt: di chuyển hai tập tin ở đâu đó. Tôi không nghĩ rằng đây là một ý tưởng tuyệt vời, đặc biệt là vì có một giải pháp tốt hơn nhiều bằng cách sử dụng rename.
yo '

4
@tohecz: Tại sao nó khó hiểu? Đó là một tính năng của shell và mọi người đều có thể biết nó bằng cách đọc trang shell man. Và tôi không nghĩ renamelà một giải pháp tốt hơn bởi vì renamekhông bao giờ yêu cầu bạn ghi đè tập tin hiện có hay không.
cuonglm

1
@Gnouc bạn là người đàn ông.
beginer

20

Bạn cũng có thể sử dụng rename(một phần của gói linux-linux).

rename .txt .sh ~/folder/subfolder/file.txt

Xem trang đổi tên người đàn ông để biết thêm chi tiết.


+1 Đây là cách rõ ràng để làm điều đó, tốt hơn nhiều so với việc dựa vào {a,b}chức năng của shell .
yo '

5
Trong một số bản phân phối Linux (như Ubuntu), renamelà một chương trình hoàn toàn khác nhau, dựa trên perl. Ở đó, bạn sẽ sử dụng rename 's/txt$/sh/' ~/folder/subfolder/file.txt.
evilsoup

Trên Debian (và Ubuntu), cũng có mmv.
ctrl-alt-delor

10

Tất cả các bên trên là tốt. Điều này cũng sẽ làm việc:

( cd ~/folder/subfolder && mv file.txt file.sh )

Không. Nó không hoạt động với tôi!
Hamed Kamrava

Nó sẽ hoạt động nếu bạn loại bỏ sudomột phần.
Cthulhu

1
@Cthulhu Có quyền của bạn. Nhưng tại sao không làm việc với sudo?
Hamed Kamrava

2
@HamedKamrava Có lẽ bởi vì sudonó diễn giải ~như thư mục chính của root.
Cthulhu

Bạn có thể sudosự mv, nhưng không phải cd. Xem tại sao cd là một lớp vỏ được xây dựng trong Và bạn không thể. sudoSự(
ctrl-alt-delor

6

Không. Bạn cần cung cấp đường dẫn đầy đủ đến tệp để đổi tên nó. Thay thế duy nhất là di chuyển vào thư mục đích trước khi chạy mv:

cd ~/folder/subfolder/
mv file.txt file.sh

Ngoài ra, bạn có thể viết một hàm nhỏ đổi tên tệp trong thư mục đích. Ví dụ: thêm các dòng này vào tệp khởi tạo shell của bạn ( ~/.bashrcnếu bạn đang sử dụng bash):

lmv(){
    _path=$(dirname -- "$1")
    _target="${_path%/}/$2"
    mv -- "$1" "$_target"
}

Sau đó, mở một thiết bị đầu cuối mới hoặc chỉ chạy source ~/.bashrcđể đọc lại tệp init và bạn có thể làm:

lmv ~/folder/subfolder/file.txt file.sh

+1 cho lmv()chức năng. Tôi không biết điều đó :)
Hamed Kamrava

1
@HamedKamrava không ai biết điều đó. Tôi chỉ viết nó, nó không phải là bất cứ điều gì tiêu chuẩn.
terdon

2
Tôi biết. Ý tôi là tôi không biết tôi có thể viết chức năng của mình!
Hamed Kamrava

2

Chỉ để mở rộng tính hữu ích của câu trả lời của cuonglm (KHÔNG nhận bất kỳ tín dụng nào vì tôi thích giải pháp của anh ấy) và câu trả lời của anh ấy là một câu trả lời đúng.

Trường hợp sử dụng là chúng ta thường muốn mv một tệp ở một vị trí xa (vấn đề thực sự), ví dụ: /folder/subfolder/configFile.dat TO configFile.dat.orig

Dạng lệnh này thêm phần mở rộng tệp (không thay thế phần mở rộng ban đầu)

mv ~/folder/subfolder/file.txt{,.orig}

Giải thích: "{, .orig}" có nghĩa là thay thế (không có gì) ở cuối tên tệp bằng (một cái gì đó) ".orig"

HOẶC để xóa phần mở rộng tệp (đảo ngược tên)

mv ~/folder/subfolder/file.txt{.orig,}

Lưu ý: Vẫn theo chủ đề cho "Cách nhanh nhất để đổi tên tệp mà không cần gõ lại đường dẫn dir"


1

Đúng. Nếu bạn sử dụng bash, bạn làm sudo pushd ~/folder/subfolder/ && sudo mv ./file.txt ./file.sh && popd.

Cái nào thực sự lớn hơn và có thể thất bại nếu bạn mất quyền truy cập vào thư mục gốc khi bạn đã làm popd.


1
Điểm của pushdpopdở đây là gì? Làm thế nào là tốt hơn cd ~/folder/subfolder/ && sudo mv file.txt file.sh?
terdon

1
Vấn đề là, bạn đang ở sau lệnh trở lại trong thư mục bạn đã bắt đầu, không phải trong bất kỳ thư mục con nào. Một thay thế cho pushd popdlà sử dụng cdvà quay trở lại với cd -.
jofel

Người hỏi dường như nêu ý định không thay đổi thư mục làm việc, và popdtốt hơn là cd ../../, khi có sẵn.
41754

7
Sử dụng (cd /path/to/there && mv x y)sau đó (với một subshell)
Stéphane Chazelas

Bạn thực sự không nên đặt sudotrước pushd. Vì vậy, lệnh đầy đủ nên được pushd ...dir && sudo mv old new && popd. Thay vào đó, người ta có thể làm (cd ...dir; sudo mv old new)vì chạy trong subshell sẽ tự động thay đổi thư mục.
Mikko Rantalainen
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.