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
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
Câu trả lời:
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.
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?
`DIR=./really/long/path/mv "$DIR"foo.bar "$DIR"foo.bzTrong một dòng: DIR=./really/long/path/; mv "$DIR"foo.bar "$DIR"foo.bz
cdvào thư mục bạn muốn làm việc:cd ./really/long/pathmv foo.bar foo.bzTrong một dòng: cd ./really/long/path && mv foo.bar foo.bz
&&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.
cdvào thư mục vàmvtừ đó?