Cara tercepat untuk mengganti nama file, tanpa mengetik ulang jalur direktori


56

Saya tahu cara mengganti nama file di Unix:

$ mv ~/folder/subfolder/file.txt ~/folder/subfolder/file.sh

     ^-------this part------^    ^------this part-------^

Terlalu lama untuk mengulang ~/folder/subfolder/filedua kali.

Apakah ada cara yang lebih cepat?

Jawaban:


104

Jika shell Anda didukung Brace Ekspansi (bekerja dengan csh, tcsh, ksh, zsh, bash, mksh, lksh, pdksh, yashdengan brace-Bentangkan diaktifkan dengan menelepon yash --brace-expandatau set di shell interative dengan set -o brace-expand, atau fish):

mv ~/folder/subfolder/file.{txt,sh}

4
sederhana adalah yang terbaik!
Braiam

2
penggunaan luar biasa ekspansi di shell brilian!
harish.venkat

3
Ini adalah mengagumkan, tapi benar-benar samar. Ini berfungsi tetapi pada pandangan pertama saya akan berpikir itu melakukan sesuatu yang berbeda: memindahkan dua file di suatu tempat. Saya rasa ini bukan ide yang bagus, terutama karena ada solusi yang jauh lebih baik menggunakan rename.
yo

4
@tececz: Mengapa ini samar? Ini adalah fitur shell dan setiap orang bisa mengetahuinya dengan membaca halaman manual shell. Dan saya tidak berpikir renameini solusi yang lebih baik karena renametidak pernah meminta Anda untuk mengganti file yang ada atau tidak.
cuonglm

1
@ Gnouc kamu laki-laki.
beginer

20

Anda juga dapat menggunakan rename(bagian dari paket util-linux).

rename .txt .sh ~/folder/subfolder/file.txt

Lihat mengganti nama halaman manual untuk lebih jelasnya.


+1 Ini adalah cara yang jelas bagaimana melakukannya, jauh lebih baik daripada mengandalkan {a,b}fungsionalitas shell .
yo

5
Dalam beberapa distro Linux (seperti Ubuntu), renameadalah program berbasis perl yang sama sekali berbeda. Di sana, Anda akan menggunakannya rename 's/txt$/sh/' ~/folder/subfolder/file.txt.
evilsoup

Di Debian (dan Ubuntu), ada juga mmv.
ctrl-alt-delor

10

Semua hal di atas baik. Ini juga akan berfungsi:

( cd ~/folder/subfolder && mv file.txt file.sh )

Tidak. Itu tidak berhasil untukku!
Hamed Kamrava

Ini akan berfungsi jika Anda menghapus sudobagian.
Cthulhu

1
@ Cthulhu Ya benar. Tetapi mengapa tidak berhasil sudo?
Hamed Kamrava

2
@HamedKamrava Mungkin karena dengan sudoitu diartikan ~sebagai direktori home root.
Cthulhu

Anda bisa sudodengan mv, tapi tidak cd. Lihat mengapa cd adalah shell dibangun di Dan Anda tidak bisa. sudoYang(
ctrl-alt-Delor

6

Tidak. Anda perlu memberikan path lengkap ke file untuk mengganti namanya. Satu-satunya alternatif adalah pindah ke folder target sebelum menjalankan mv:

cd ~/folder/subfolder/
mv file.txt file.sh

Atau, Anda bisa menulis fungsi kecil yang mengubah nama file di direktori target. Misalnya, tambahkan baris ini ke file inisialisasi shell Anda ( ~/.bashrcjika Anda menggunakan bash):

lmv(){
    _path=$(dirname -- "$1")
    _target="${_path%/}/$2"
    mv -- "$1" "$_target"
}

Kemudian, buka terminal baru atau jalankan source ~/.bashrcuntuk membaca kembali file init dan Anda dapat melakukannya:

lmv ~/folder/subfolder/file.txt file.sh

+1 untuk lmv()fungsi. Saya tidak tahu itu :)
Hamed Kamrava

1
@HamedKamrava tidak ada yang tahu. Saya hanya menulisnya, itu bukan standar apa-apa.
terdon

2
Aku tahu. Maksud saya, saya tidak tahu saya bisa menulis fungsi saya sendiri!
Hamed Kamrava

2

Hanya untuk memperluas kegunaan jawaban cuonglm (BUKAN untuk mengambil kredit karena saya suka solusinya) dan jawabannya adalah yang benar.

Kasus penggunaannya adalah bahwa kita sering ingin melakukan mv file di lokasi yang jauh (masalah sebenarnya), misal /folder/subfolder/configFile.dat TO configFile.dat.orig

Bentuk perintah ini menambahkan ekstensi file (tidak mengganti ekstensi asli)

mv ~/folder/subfolder/file.txt{,.orig}

Dijelaskan: "{, .orig}" berarti ganti (tidak ada) di akhir nama file dengan (sesuatu) ".orig"

ATAU untuk menghapus ekstensi file (membalikkan ganti nama)

mv ~/folder/subfolder/file.txt{.orig,}

Catatan: Masih pada topik untuk "Cara tercepat untuk mengubah nama file tanpa mengetik ulang jalur dir"


1

Iya. Jika Anda menggunakan bash, Anda melakukannya sudo pushd ~/folder/subfolder/ && sudo mv ./file.txt ./file.sh && popd.

Yang sebenarnya lebih besar dan mungkin gagal jika Anda kehilangan izin akses ke direktori asli ketika Anda melakukannya popd.


1
Apa gunanya pushddan di popdsini? Bagaimana ini lebih baik daripada cd ~/folder/subfolder/ && sudo mv file.txt file.sh?
terdon

1
Intinya adalah, bahwa Anda mengikuti perintah kembali di folder yang Anda mulai, bukan di subfolder. Alternatif untuk pushd popdmenggunakan cddan kembali dengan cd -.
jofel

Penanya tampaknya menyatakan niat untuk tidak mengubah direktori kerja, dan popdlebih baik daripada cd ../../, jika tersedia.
41754

7
Gunakan (cd /path/to/there && mv x y)kemudian (dengan subkulit)
Stéphane Chazelas

Anda benar-benar tidak harus meletakkan sudosebelumnya pushd. Jadi perintah penuh seharusnya pushd ...dir && sudo mv old new && popd. Sebagai alternatif, orang dapat melakukannya (cd ...dir; sudo mv old new)karena menjalankan subshell akan menangani perubahan direktori secara otomatis.
Mikko Rantalainen
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.