Baris perintah memindahkan file dengan jalur direktori panjang tanpa mengulangi jalur direktori


16

Apakah ada cara menjalankan mvperintah tanpa mengetikkan path lengkap dalam argumen kedua?

Contoh:

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


1
Apa alasan Anda tidak bisa hanya cdke direktori dan mvdari sana?
— zpletan

Saya sering menemukan diri saya menjalankan perintah-perintah semacam ini di banyak direktori dalam pekerjaan saya sehari-hari. Saya sering perlu menjalankan beberapa perintah dari direktori induk yang diberikan.
— Finbarr

Entah bagaimana saya menemukan itu menggunakan !! (tanda seru ganda) dalam terminal digunakan untuk menjalankan perintah terakhir yang dijalankan. Anda juga dapat menambahkan parameter / teks ke perintah terakhir tetapi tidak pernah mencoba mengubah / menghapus teks dari perintah terakhir. Cobalah dan jika Anda berhasil saya akan menjatuhkan ini seperti jawaban. Semoga berhasil!
— Geppettvs D'Constanzo

Jawaban:


32

Anda dapat menggunakan ekspansi brace bash. Ini:

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

akan berkembang menjadi:

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

dan kemudian mvdijalankan dengan dua argumen itu. Lihat http://wiki.bash-hackers.org/syntax/expansion/brace untuk informasi lebih lanjut tentang ekspansi brace.


3
Itu mulia. Saya tidak tahu Anda bisa melakukan itu.
— Finbarr

5

Sebagai alternatif terhadap penjepit ekspansi, Anda dapat menggunakan fitur ekspansi riwayat bash shell :

  • ! memperkenalkan ekspansi sejarah
  • # penunjuk acara menunjukkan perintah saat ini
  • $ kata designator mengacu pada argumen terakhir

Anda dapat melakukan substitusi pada ekspansi menggunakan s/pattern/replacementsintaks sed-like eg

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

Ex.

$ 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'

Jika Anda menginginkan jalur secara khusus (misalnya, ke mvfile dengan nama yang sama sekali berbeda yang tidak mudah diperoleh dengan substitusi), Anda dapat menggunakan hpengubah:

$ 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'

Untuk opsi lain, termasuk readlinekombinasi tombol untuk menarik argumen terakhir, lihat Bagaimana mengulangi parameter yang saat ini diketik pada konsol bash?


2

Anda mungkin mencoba:

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

2

Dengan variabel

  1. Simpan direktori dalam sebuah variabel: `DIR=./really/long/path/
  2. gunakan bergerak: mv "$DIR"foo.bar "$DIR"foo.bz

Dalam satu baris: DIR=./really/long/path/; mv "$DIR"foo.bar "$DIR"foo.bz


Mengubah direktori

  1. Anda juga bisa cdke direktori tempat Anda ingin bekerja:cd ./really/long/path
  2. lalu ganti nama file: mv foo.bar foo.bz

Dalam satu baris: cd ./really/long/path && mv foo.bar foo.bz


1
yang kedua terlihat akrab ;-)
— zpletan

2
Penggunaan terbaik &&dalam one-liner terakhir. Kalau tidak, jika cdgagal, mvakan dijalankan di direktori yang salah, berpotensi menimpa file. Dengan cd ./really/long/path && mv foo.bar foo.baz, mvhanya akan dijalankan jika cdberhasil mengubah direktori.
— geirha

-3

Anda dapat meminta alias untuk menyingkat nama direktori:

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

1
-1 alias test='/var/log' ; cd testmemberi -bash: cd: test: No such file or directory.
— zpletan
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.