Thay đổi thư mục thành mục tiêu của hoạt động di chuyển


12

Thỉnh thoảng, tôi đã chỉnh sửa một số tập tin và muốn chuyển nó sang một thư mục khác. (Thông thường: vào thư mục Dropbox, nơi tôi không muốn làm việc để tránh cho các chủ sở hữu khác của thư mục cập nhật liên tục.) Tôi làm điều này, ví dụ, với

mv file.pdf ../../../Dropbox/sharedfolder/subdirectory/file.pdf

Sau đó, tôi thường thấy mình muốn thay đổi thư mục thành thư mục đích của hoạt động di chuyển trước đó. Tôi thấy mình đang bắn mũi tên lên, xóa trận chung kết file.pdf, giữ trái, xóa mv file.pdfvà thay thế nó bằng cd.

Có cách nào nhanh hơn, thông minh hơn để làm việc này không? Có một lệnh "di chuyển tập tin và sau đó thay đổi thư mục thành", hoặc một phím tắt cho thư mục được sử dụng cuối cùng, hoặc một cái gì đó như thế?


1
nếu bạn giữ CTRL + Trái, nó sẽ chuyển sang trái bằng từ nhanh hơn
cat

Nhận xét bên lề, không phải là câu trả lời cho câu hỏi shell của bạn: Tôi thường chỉ tạm dừng Dropbox trong khi chỉnh sửa. Nó cũng đảm bảo không có tập tin nào khác được thay đổi "dưới chân tôi".
Constantino Tsarouhas ngày

Câu trả lời:


17

Nếu bạn đang sử dụng bash, thì tương tác lịch sử của nó chỉ là lối tắt cho việc này. Trình chỉ định từ cho đối số cuối cùng của lệnh trước:

!!:$
chỉ định đối số cuối cùng của lệnh trước. Điều này có thể được rút ngắn để !$.

Kết hợp với một sửa đổi để loại bỏ thành phần tên đường dẫn cuối cùng:

Sau trình chỉ định từ tùy chọn, bạn có thể thêm một chuỗi gồm một hoặc nhiều từ bổ nghĩa hợp lệ , mỗi chuỗi đứng trước dấu ':'.

h
Xóa một thành phần tên đường dẫn, chỉ để lại phần đầu.

Vì thế:

$ echo /ab/c/d
/ab/c/d
$ echo !$:h
echo /ab/c
/ab/c

Phím tắt tương tự cũng có thể được sử dụng với zsh.


1
Điều này thật tuyệt
Anh Cả Geek

4

Nếu bạn không thay đổi tên tệp, bạn có thể bỏ qua nó và mv sẽ tự động thêm nó; Điều này đặc biệt hữu ích khi di chuyển nhiều tệp:

mv file.pdf ../../../Dropbox/sharedfolder/subdirectory/

mv *.pdf ../../../Dropbox/sharedfolder/subdirectory/

Với thư mục là đối số cuối cùng, bạn có thể sử dụng !!:$hoặc !$như câu trả lời của muru mô tả.
Nếu bạn đang sử dụng bash với các mặc định thông thường, bạn có thể sử dụng Alt+ .thay thế.
(Đây là insert-last-argumentlệnh readline ; bind -psẽ liệt kê tất cả các ràng buộc hiện tại của bạn.)


1
lưu ý rằng bỏ qua tên tệp đích có thể âm thầm ghi đè tệp đích nếu nó đã tồn tại
cat

mvluôn luôn ghi đè các tệp đích một cách im lặng trừ khi bạn chỉ định các tùy chọn -i/ --interactivehoặc -n/ --no-clobber. Đó là lý do tại sao tôi có alias mv='mv -i' cp='cp -i'trong tôi .bashrc.
David foerster

-1

Một cách tiếp cận khác là tạo lệnh riêng của bạn dành riêng cho mục đích này. Điều này có thể được thực hiện thông qua chức năng có thể trông giống như:

$ function mv-special { mv $1 $2; cd $(dirname $(echo $2-)); }

Trong đó: (1) mv-special là tên hàm; (2) các biến $1$2là đối số trong hàm, người sẽ được sử dụng bởi các lệnh mvcd; (3) $(echo $2-) thêm một ký tự mèo vào cuối chuỗi trong var $2và sửa hành vi của dirnamenếu biến $2chỉ chứa đường dẫn; (4) $(dirname $(echo $2-)) sẽ chỉ lọc đường dẫn từ $2.

Theo câu trả lời này , chức năng có thể trông giống như:

$ function mv-special { mv $1 $2; cd ${2%/*}; }

Trong đó: ${2%/*}sẽ chỉ lọc đường dẫn từ $2.

Để có sẵn dưới dạng lệnh, chức năng này phải được xuất :

$ export -f mv-special

Sử dụng:

$ mv-special file.pdf ../../../Dropbox/sharedfolder/subdirectory/file.pdf

hoặc là:

$ mv-special file.pdf ../../../Dropbox/sharedfolder/subdirectory/

Vui lòng chú ý đến điều đó - đối với cả hai biến thể - đối số thứ hai ( $2) phải kết thúc bằng tên tệp hoặc dấu gạch chéo (/ ).

Để có sẵn lệnh mới của chúng tôi, định nghĩa của hàm và lệnh xuất phải được thêm vào ~/.bashrc:

# My custom 'mv-special' command:
function mv-special { mv $1 $2; cd $(dirname $(echo $2-)); }
export -f mv-special

hoặc là:

# My custom 'mv-special' command:
function mv-special { mv $1 $2; cd ${2%/*}; }
export -f mv-special

nhập mô tả hình ảnh ở đây


Lệnh tùy chỉnh có thể được thực hiện và thông qua tệp tập lệnh thực thi được đặt trong ~/binhoặc trong /usr/sbin: Làm cách nào tôi có thể tạo lệnh đầu cuối tùy chỉnh (để chạy tập lệnh)? Nhưng thành thật mà nói, tôi đã phải đối mặt với một rắc rối với hành vi cdtrong kịch bản này.

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.