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?

Hamed Kamrava
sumber

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}
cuonglm
sumber
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.

Jofel
sumber
+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 )
Bjorn
sumber
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
terdon
sumber
+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"

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

41754
sumber
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