Di Linux saya terkadang mengganti nama file seperti ini:
mv dir1/dir2/dir3/file.txt dir1/dir2/dir3/file.txt.old
Perhatikan bahwa saya hanya ingin mengganti nama file, tidak memindahkannya ke direktori lain.
Apakah ada perintah yang memungkinkan saya melakukan versi singkat dari perintah itu? Saya sedang memikirkan sesuatu seperti:
mv dir1/dir2/dir3/file.txt file.txt.old
atau mungkin bahkan sesuatu seperti (hanya menambahkan nama):
mv dir1/dir2/dir3/file.txt {}.old
Tujuan saya adalah tidak harus menentukan path lengkap lagi.
Saya tahu "contoh-contoh" yang saya tulis itu tidak berhasil, tetapi itu hanyalah gagasan tentang apa yang ingin saya capai.
Saya tidak mau harus masuk ke direktori.
linux
filesystems
files
mv
santiago arizti
sumber
sumber
(cd dir1/dir2/dir3 && exec mv file.txt{,.old})
secara efektif memiliki kinerja yang sama dengan kode tanpa subproses, karenaexec
menghindarifork()
selama permintaan perintah eksternal, sehingga Anda memiliki tepat satu garpu jalan baik.Jawaban:
untuk satu file coba
tempat
X{a,b}
konstruksi berkembangXa Xb
, Anda dapat menggunakan pratinjau menggunakanuntuk melihat apakah itu sesuai dengan kebutuhan Anda.
catatan:
itu untuk banyak file
tidak mungkin berkembang ke apa yang Anda inginkan. (ini akan diperluas ke campuran file.txt file1.txt.old file2.txt ...)
{txt,txt.old}
dapat disingkat menjadi{,.old}
sesuai komentarjika nama direktori tidak ambigu, wildcard dapat digunakan.
untuk penggunaan banyak file
rename
drop
-n
untuk memiliki nama yang efektif.sumber
mv dir1/dir2/dir3/file.txt{,.old}
juga bekerja, dan bahkan lebih pendek?Perintah
rename
mengganti nama semua file yang cocok. Tujuan utamanya adalah untuk mengubah nama banyak file, tetapi jika ekspresi Perl hanya cocok dengan satu file, maka itu akan mengubah nama hanya file tunggal ini. Untuk rincian dan sintaks khusus distro silahkan baca manual ini:man rename
.Contoh penggunaan: ganti nama "/path/file.txt" menjadi "/path/file.txt.old":
rename 's/file.txt/file.txt.old/g' /path/file.txt
Notasi lebih pendek (terima kasih kepada shalomb):
Untuk penggunaan jangka kering
rename -n
.Lebih banyak contoh dan detail dapat ditemukan di https://thepcspy.com/read/bulk-rename-files-in-ubuntu/
sumber
rename
perintah yang berbeda dengan perilaku yang sama sekali berbeda..old
nama file ini, mungkin sedikit lebih mudah untuk melakukanrename 's/$/.old/' /path/to/file.txt
ataurename '$_.=".old"' /path/to/file.txt
Untuk kasus satu kali, jika saya tidak ingin mengubah direktori saya saat ini, saya mungkin menggunakan sub-shell:
Karena Anda
cd
berada di dalam sub-shell, Anda belum mengubah direktori di shell Anda yang sebenarnyasumber
&& exec mv
- dengan cara itu Anda tidak mencoba untuk melakukan penggantian nama jikacd
gagal, danexec
mengkonsumsi subkulit, sehingga menghindari penalti kinerja.&&
Untuk satu kasus, seperti yang saya katakan, saya tidak akan khawatir tentang biaya sub-shell (tetap sederhana: bisa dengan mudah mengingat bagaimana melakukannya adalah IMO yang lebih penting)Saya suka solusi @ archemar menggunakan ekspansi {}, karena Anda dapat menggunakannya ketika Anda sudah memulai baris perintah Anda. Berikut beberapa kemungkinan lain untuk kelengkapan:
(Kutipan hanya diperlukan jika Anda memiliki spasi atau karakter pemecah kata lainnya dalam nama)
Catatan:
mymv
bisa berupa string yang masuk akal, saya menggunakan mymv untuk "my move".Yang lainnya:
tapi
(dari @Adam dan @CharlesDuffy) bisa dibilang lebih baik jika cd gagal.
sumber
mmv
, sudah ada program bernama cara ini.Jika Anda ingin memasukkan subdirektori untuk mempersingkat
mv
perintah, tetapi ingin kembali ke direktori saat ini setelahnya, ada dua cara untuk melakukannya. Salah satunya adalah dengan meletakkancd
danmv
dalam subkulit (seperti yang telah disarankan).Yang lainnya adalah menggunakan
pushd
danpopd
mengubah direktori:The
pushd
perintah seperticd
, kecuali pertama kali mendorong nama direktori saat ini ke tumpukan.popd
menghapus nama teratas dari tumpukan dan mengubah ke direktori itu.sumber
pushd
danpopd
ekstensi dimaksudkan untuk penggunaan interaktif - POSIX secara eksplisit mencantumkannya sebagai "hasil tidak ditentukan", dan shell yang dibuat untuk menjalankan skrip (mis. pada lingkungan seminimal mungkin tertanam) tidak perlu mendukungnya.Saya hanya akan melakukannya
sumber
Solusi yang melibatkan:
mv something{.txt,.txt.old}
menggunakan "bashism". Jika Anda menginginkan cara yang lebih portabel, gunakan manipulasi variabel umum:sumber
${var/text/replacement}
adalah bashism itu sendiri.