file cp atau mv ke direktori yang sama dengan yang sudah ada ketika saya berada di direktori yang lain?

12

Jika saya masuk ~/blobdan saya punya file~/blob/a_long_directory_name/c/x.x

saya bisa mengetik

mv blob/a_long_directory_name/c/x.x blob/a_long_directory_name/even_more/y.y

Apakah ada jalan pintas di mana saya dapat mengetikkan sesuatu yang lebih pendek yang menggunakan jalur direktori di param pertama (bukan direktori saya saat ini), misalnya

mv blob/a_long_directory_name/c/x.x $same_dir/y.y

di mana sesuatu seperti $same_dirakan menunjuk ke dir dari param 1

Michael Durrant
sumber

Jawaban:

8

Untuk meminimalkan jumlah pengetikan, mungkin paling mudah melakukannya dengan dua langkah. CD ke direktori, lalu pindah.

Jika Anda hanya memiliki satu perintah, Anda dapat menggunakan subkulit:

$ (cd blob/a_long_directory_name/c/ && mv x.x y.y )

Itu berarti cdhanya akan berlaku di subkulit, mvhanya akan terjadi jika cdberhasil, dan direktori kerja shell Anda saat ini tidak akan berubah.

Jika Anda memiliki lebih dari satu perintah, gunakan tumpukan direktori.

$ pushd blob/a_long_directory_name/c/
$ mv x.x y.y
$ mv z.z q.q
$ popd
Alan Shutko
sumber
Ini tidak membahas even_morejalan relatif ...
Useless
Itu betul. Contoh $ same_dir tampaknya mengabaikannya juga.
Alan Shutko
+1 Saya menyukainya. Sangat mudah diingat dan dilakukan dan itu adalah kunci bagi saya
Michael Durrant
Menarik, karena tidak melakukan apa yang Anda minta. Mungkin pertanyaan Anda tidak persis seperti yang Anda maksudkan?
berguna
Tidak berguna, saya memperbarui judul saya untuk mengklarifikasi bahwa ini tentang file cp / mv dan menyimpannya di direktori yang sama, meskipun saya berada di direktori lain. btw nama pengguna Anda imut tapi itu membuat komentar terlihat konyol ketika digunakan di dalamnya :)
Michael Durrant
26

Dengan bash, Anda bisa menggunakan ekspansi brace

mv blob/a_long_directory_name/{c/x.x,evenmore/y.y}
iruvar
sumber
5

Anda bisa menggunakan kemampuan subtitusi teks shell Anda. Di bash, Anda bisa menggunakan binatang seperti:

mv blob/a_long_directory_name/c/xx !#:$:gs^c/xx^evenmore/yy

Untuk memecahnya:

!# adalah baris saat ini diketik sejauh ini

:$meminta untuk memilih kata terakhir (ganti dengan nomor nuntuk memilih nkata th) dari string yang sedang dipertimbangkan ( !#dalam hal ini). Kata terakhir dari baris yang diketik sejauh ini adalah kata sebelumnya.

:gs^xx^yymelakukan global ( g) subtitusi teks ( s) pada kata yang dihasilkan, menggantikan 'xx' dengan 'yy'. ^hanyalah pembatas untuk sperintah untuk mengizinkan penggunaan /dalam pola Anda.

Metode ini sedikit lebih umum karena memungkinkan Anda mengganti bagian mana pun dari jalur ('xx') dengan kata lain ('yy').

Terakhir, seperti halnya manipulasi riwayat apa pun, ada baiknya mengatur opsi shell yang sesuai (misalnya di ~/.bashrc). Pada kasus ini

shopt -s histverify

akan menampilkan baris yang diedit setelah Anda menekan kembali, sehingga Anda masih dapat mengeditnya dan memeriksa kesalahan.

Mengapa Anda menggunakan konstruk seperti itu, saya tidak yakin, tetapi berfungsi dalam hal ini.

Wojtek
sumber
a) Terlalu banyak noise jalur (dibandingkan dengan ekspansi brace yang elegan) b) Tidak menyelesaikan masalah OP: mereka ingin mengganti c/x.xdengan evenmore/y.ymempertahankan awalan jalur asli.
Joseph R.
Komentar kedua Anda adalah kelalaian sederhana di pihak saya, yang memerlukan perbaikan sederhana untuk memperbaikinya. Saya tidak melihat bagaimana jawaban ini layak untuk downvote. Dengan hasil edit (teknis), ia memecahkan masalah dan lebih umum karena memungkinkan bertukar bagian mana pun dari jalur (saya sering menggunakan sesuatu yang serupa pada $PWD). Tentu, mungkin itu bukan yang paling elegan tetapi menunjuk pada fakta bahwa shell memang memiliki pergantian teks dan perancang kata, yang mungkin masih berguna bagi beberapa pengguna untuk diteliti.
Wojtek
BAIK. Saya berdiri dikoreksi.
Joseph R.