Tập tin di chuyển dòng lệnh với đường dẫn thư mục dài mà không lặp lại đường dẫn thư mục


16

Có cách nào để thực thi một mvlệnh mà không cần nhập đường dẫn đầy đủ trong đối số thứ hai không?

Thí dụ:

mv my/file/that/has/a/really/long/path/foo.bar some_magic_operator_that_means_the_same_directory/foo.baz


1
Bất kỳ lý do bạn không thể chỉ cdvào thư mục và mvtừ đó?
zpletan

Tôi thường thấy mình thực thi các loại lệnh này trên nhiều thư mục trong công việc hàng ngày. Tôi thường cần phải thực thi một số lệnh từ một thư mục cha nhất định.
Finbarr

Bằng cách nào đó tôi thấy rằng sử dụng !! (dấu chấm than kép) trong một thiết bị đầu cuối sử dụng để chạy lệnh cuối cùng được thực thi. Bạn cũng có thể thêm tham số / văn bản vào lệnh cuối cùng nhưng không bao giờ cố gắng thay đổi / xóa văn bản khỏi lệnh cuối cùng. Hãy thử nó và nếu bạn thành công tôi sẽ bỏ nó như một câu trả lời. Chúc may mắn!
Geppettvs D'Constanzo

Câu trả lời:


32

Bạn có thể sử dụng mở rộng cú đúp của bash. Điều này:

mv my/file/that/has/a/really/long/path/foo.{bar,baz}

sẽ mở rộng thành:

mv my/file/that/has/a/really/long/path/foo.bar my/file/that/has/a/really/long/path/foo.baz

và sau đó mvđược chạy với hai đối số đó. Xem http://wiki.bash-hackers.org/syntax/Exansion/brace để biết thêm về mở rộng niềng răng.


3
Thật vinh quang. Tôi không biết bạn có thể làm điều đó.
Finbarr

5

Thay thế cho mở rộng cú đúp, bạn có thể sử dụng các tính năng mở rộng lịch sử của bash shell :

  • ! giới thiệu một mở rộng lịch sử
  • # người chỉ định sự kiện biểu thị lệnh hiện tại
  • $ từ chỉ định đề cập đến đối số cuối cùng

Bạn có thể thực hiện thay thế trên bản mở rộng bằng s/pattern/replacementcú pháp giống như sed, vd

somecommand path/to/foo.bar !#$:s/.bar/.baz

Ví dụ.

$ mv -v somepath/Original/Dir3/SubDir1/foo.bar !#$:s/.bar/.baz
mv -v somepath/Original/Dir3/SubDir1/foo.bar somepath/Original/Dir3/SubDir1/foo.baz
'somepath/Original/Dir3/SubDir1/foo.bar' -> 'somepath/Original/Dir3/SubDir1/foo.baz'

Nếu bạn muốn đường dẫn cụ thể (ví dụ: đến mvmột tệp có tên hoàn toàn khác mà không dễ dàng có được bằng cách thay thế), bạn có thể sử dụng công cụ hsửa đổi:

$ mv -v somepath/Original/Dir3/SubDir1/foo.baz !#$:h/baz.foo
mv -v somepath/Original/Dir3/SubDir1/foo.baz somepath/Original/Dir3/SubDir1/baz.foo
'somepath/Original/Dir3/SubDir1/foo.baz' -> 'somepath/Original/Dir3/SubDir1/baz.foo'

Đối với các tùy chọn khác, bao gồm readlinecác tổ hợp phím để kéo ra đối số cuối cùng, hãy xem Cách lặp lại tham số hiện được nhập trong tham số trên bảng điều khiển bash?


2

Bạn có thể thử:

pushd .
cd /really/long/directory/name/
mv whatever.1 whatever.2
popd

2

Với một biến

  1. Lưu thư mục trong một biến: `DIR=./really/long/path/
  2. sử dụng di chuyển: mv "$DIR"foo.bar "$DIR"foo.bz

Trong một dòng: DIR=./really/long/path/; mv "$DIR"foo.bar "$DIR"foo.bz


Thay đổi thư mục

  1. Bạn cũng có thể cdvào thư mục bạn muốn làm việc:cd ./really/long/path
  2. sau đó thay đổi tên tập tin: mv foo.bar foo.bz

Trong một dòng: cd ./really/long/path && mv foo.bar foo.bz


1
cái thứ hai đó trông có vẻ quen thuộc ;-)
zpletan

2
Sử dụng tốt nhất &&trong đó một lót cuối cùng. Mặt khác, nếu cdthất bại, mvsẽ bị chạy trong thư mục sai, có khả năng ghi đè lên một tệp. Với cd ./really/long/path && mv foo.bar foo.baz, mvsẽ chỉ được chạy nếu cdthành công trong việc thay đổi thư mục.
geirha

-3

Bạn có thể lệnh bí danh để rút ngắn tên thư mục:

alias src='/directory/name/of/source'
alias dst='/directory/name/of/destination'
mv src dst

1
-1 alias test='/var/log' ; cd testcho -bash: cd: test: No such file or directory.
zpletan
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.