Ubah direktori ke target operasi pemindahan

12

Kadang-kadang, saya telah mengedit beberapa file dan ingin memindahkannya ke folder lain. (Biasanya: ke folder Dropbox, tempat saya tidak ingin bekerja untuk menghindari memberi pemilik lain pembaruan konstan folder.) Saya melakukan ini, misalnya, dengan

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

Setelah itu, saya sering menemukan diri saya ingin mengubah direktori ke direktori target dari operasi pemindahan saya sebelumnya. Saya menemukan diri saya menekan panah atas, menghapus final file.pdf, memegang kiri, menghapus mv file.pdfdan menggantinya dengan cd.

Apakah ada cara yang lebih cepat dan lebih cerdas untuk melakukan ini? Apakah ada perintah "pindahkan file dan kemudian ubah direktori ke", atau pintasan untuk direktori yang terakhir digunakan, atau sesuatu seperti itu?

Mees de Vries
sumber
1
jika Anda memegang CTRL + Kiri, itu akan pergi ke kiri dengan kata yang lebih cepat
cat
Komentar sampingan, bukan jawaban untuk pertanyaan shell Anda: Saya biasanya hanya menjeda Dropbox saat mengedit. Ini juga memastikan tidak ada file lain yang diubah "di bawah kaki saya".
Constantino Tsarouhas

Jawaban:

17

Jika Anda menggunakan bash, interaksi riwayatnya hanya memiliki jalan pintas untuk ini. The kata penanda untuk argumen terakhir dari perintah sebelumnya:

!!:$
menunjuk argumen terakhir dari perintah sebelumnya. Ini dapat disingkat menjadi !$.

Dikombinasikan dengan pengubah untuk menghapus komponen pathname terakhir:

Setelah penunjuk kata opsional, Anda dapat menambahkan urutan satu atau lebih dari pengubah yang valid , masing-masing didahului oleh ':'.

h
Hapus komponen trailing pathname, hanya menyisakan head.

Begitu:

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

Pintasan yang sama juga bisa digunakan dengan zsh.

muru
sumber
1
Ini sangat keren.
Penatua Geek
4

Jika Anda tidak mengubah nama file, Anda dapat menghilangkannya dan saya akan menambahkannya secara otomatis; ini sangat berguna saat memindahkan banyak file:

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

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

Dengan direktori sebagai argumen terakhir, Anda dapat menggunakan !!:$atau !$seperti yang dijelaskan jawaban muru.
Jika Anda menggunakan bash dengan default yang biasa, Anda dapat menggunakan Alt+ .sebagai gantinya.
(Ini adalah insert-last-argumentperintah readline ; bind -pakan mencantumkan semua binding Anda saat ini.)

deltab
sumber
1
perhatikan bahwa menghilangkan nama file tujuan dapat secara diam-diam menimpa file tujuan jika sudah ada
cat
mvselalu menimpa file tujuan secara diam-diam kecuali Anda menentukan opsi -i/ --interactiveatau -n/ --no-clobber. Itu sebabnya saya miliki alias mv='mv -i' cp='cp -i'di blog saya .bashrc.
David Foerster
-1

Pendekatan lain adalah membuat perintah sendiri yang didedikasikan untuk tujuan ini. Ini dapat dilakukan melalui fungsi yang dapat terlihat seperti:

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

Di mana: (1) mv-special adalah nama fungsi; (2) variabel $1dan $2argumen dalam fungsi yang akan digunakan oleh perintah mvdan cd; (3) $(echo $2-) menambahkan karakter wildcat ke akhir string di var $2, dan memperbaiki perilaku dirnamejika variabel $2hanya berisi path; (4) $(dirname $(echo $2-)) hanya akan memfilter jalur dari $2.

Menurut jawaban ini fungsinya bisa seperti:

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

Di mana: ${2%/*}akan menyaring hanya jalur dari $2.

Agar tersedia sebagai perintah, fungsi ini harus diekspor :

$ export -f mv-special

Pemakaian:

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

atau:

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

Harap perhatikan bahwa - untuk kedua varian - argumen kedua ( $2) harus diakhiri dengan nama file atau slash ( /).

Agar perintah baru kami tersedia secara permanen, definisi fungsi dan perintah ekspor harus ditambahkan ke ~/.bashrc:

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

atau:

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

masukkan deskripsi gambar di sini


Perintah kustom dapat dibuat dan melalui file skrip yang dapat dieksekusi yang ditempatkan di ~/binatau di /usr/sbin: Bagaimana cara membuat perintah terminal kustom (untuk menjalankan skrip)? Tapi jujur ​​saja, saya menghadapi masalah dengan perilaku cddalam skenario ini.

pa4080
sumber