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

Finbarr
sumber
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.

geirha
sumber
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?

Steeldriver
sumber
2

Anda mungkin mencoba:

pushd .
cd /really/long/directory/name/
mv whatever.1 whatever.2
popd
zpletan
sumber
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

danjjl
sumber
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
shantanu
sumber
1
-1 alias test='/var/log' ; cd testmemberi -bash: cd: test: No such file or directory.
zpletan