Dalam bash, bagaimana saya bisa mengganti nama file tanpa mengulangi path? [duplikat]

39

Kemungkinan Gandakan:
Menggunakan kembali teks pada perintah bash

Jika saya ingin mengganti nama file menjadi beberapa direktori, bagaimana saya bisa menghindari mengulangi path?

Sebagai contoh:

mv path/to/old_filename.txt path/to/new_filename.txt

Saya ingin tahu apakah ada cara untuk membuat ini:

mv path/to/old_filename.txt (?)new_filename.txt

Di mana (?)akan ada cara untuk mengatakan "di direktori yang sama."

Nathan Long
sumber

Jawaban:

26

Menggunakan perluasan bash history :

mv path/to/oldfile !#:1:h/newfile

di mana !#:1:hartinya: dari baris yang sedang Anda ketikkan ("! #"), ambil kata pertama (": 1"), lalu ambil hanya komponen jalur (": h" - kepala) darinya.

glenn jackman
sumber
Ini adalah yang paling dekat dengan apa yang diasumsikan oleh penanya semula sebagai solusi, dan berguna untuk diketahui, jadi +1.
crazy2be
2
Keren! Saya pikir metode ekspansi brace Darth lebih mudah, tapi ini persis apa yang saya minta.
Nathan Long
Saya telah belajar dua hal baru yang hebat hari ini. Juga, saya akan selamanya menganggap ekspansi brace sebagai "ekspansi brace Darth" karena kedengarannya luar biasa.
PileOfMush
62

Anda dapat menggunakan ekspansi brace: mv path/to/{old_filename.txt,new_filename.txt}

Berikut ini adalah tautan ke panduan GNU tentang ekspansi brace di bash shell, yang mendefinisikan daftar pengganti dan memberitahu bash untuk mengulangi parameter menggunakan pengganti yang berbeda setiap kali diulang.

Sebagai contoh,

a{b,c,dd,e}

akan diperluas ke

ab ac add ae

Satu-satunya peringatan adalah bahwa pengulangan yang diperluas harus dapat mengikuti satu sama lain sebagai argumen untuk program target.

Darth Android
sumber
5
Atau menyimpannya untuk minimum: mv path/to/{old,new}_filename.txt. Ini juga membantu pembalikan atau jenis lain dari perintah yang dekat dengan pengulangan. Saya sudah berkali-kali melakukan mis mv /etc/X11/xorg.conf{,.backup}, bisa membalikkan proses dengan perubahan sederhana mv /etc/X11/xorg.conf{.backup,}.
Daniel Andersson
26

Jawaban Darth di atas adalah pintar, tetapi jika Anda ingin menggunakan pendekatan dengan cd, Anda juga dapat mempertimbangkan menggunakan subkulit:

(cd path/to && mv old_filename.txt new_filename.txt)

Karena perubahan direktori terjadi dalam subkulit, Anda tidak akan benar-benar mengubah direktori di shell interaktif Anda.

mlc
sumber
1
Kelemahan signifikan: Anda tidak dapat menggunakan penyelesaian tab untuk old_filename.txt.
bluenote10
9

Alternatif lain yang berguna, jika Anda akan melakukan beberapa perintah di direktori, adalah ini:

pushd /path/to
mv oldfile newfile
...
popd
KeithB
sumber
5

Saya suka jawaban @ Darth . Inilah alternatifnya:cd path/to && mv oldfile newfile && cd -

glenn jackman
sumber
1
Catatan jika mvgagal (mis., Tidak ada izin) Anda akan ditinggalkan di path/todirektori. Anda bisa mencoba cd path/to && mv oldfile newfile ; cd -memastikan cd -selalu berjalan, kecuali jika cd path/to(tidak ada izin) gagal Anda masih akan menjalankan cd -dan pergi ke direktori sebelumnya yang tidak diinginkan. mlc (+1) jawaban subkulit lebih baik. Saya kira cd . && cd path/to && mv oldfile newfile ; cd -akan bekerja 99,9% dari waktu (dengan cd .hanya gagal jika Anda atau izin dir Anda saat ini berubah; dan dalam hal ini pergi ke dir yang berbeda bukanlah hasil yang buruk.
dr jimbob