Tidak sepenuhnya jelas bagi saya, tetapi apa perbedaan antara mv
dan rename
(dari util-linux-ng 2.17.2
as /usr/bin/rename
)? Apakah ada kelebihan satu di atas yang lain di luar rename
menerima ekspresi reguler dan mv
tidak? Saya percaya rename
juga dapat menangani beberapa nama file sekaligus, sedangkan mv
tidak melakukan ini.
Saya tidak dapat menemukan indikasi yang jelas di man
halaman mereka apa lagi yang membedakan mereka atau melalui investigasi sendiri.
type -a rename
danrename --version
?rename is /usr/bin/rename
danrename (util-linux-ng 2.17.2)
masing - masing.rename
hal-hal berbeda di distro yang berbeda.Jawaban:
Pada dasarnya apa yang tertulis di tutupnya, untuk keduanya.
mv
adalah utilitas standar untuk memindahkan satu atau lebih file ke target yang diberikan. Itu dapat digunakan untuk mengganti nama file, jika hanya ada satu file untuk dipindahkan. Jika ada beberapa,mv
hanya berfungsi jika targetnya adalah direktori, dan memindahkan file ke sana.Jadi
mv foo bar
akan memindahkan filefoo
ke direktoribar
(jika ada), atau mengubah namafoo
menjadibar
(jikabar
tidak ada atau tidak direktori).mv foo1 foo2 bar
hanya akan memindahkan kedua file ke direktoribar
, atau mengeluh jikabar
bukan direktori.mv
akan memanggil fungsirename()
C library untuk memindahkan file, dan jika itu tidak berhasil (mereka dipindahkan ke sistem file lain), itu akan menyalin file dan menghapus yang asli.Jika yang Anda miliki hanyalah
mv
dan Anda ingin mengganti nama banyak file, Anda harus menggunakan shell loop. Ada sejumlah pertanyaan tentang itu di sini di situs, lihat misalnya ini , ini , dan lainnya .Di sisi lain, berbagai
rename
utilitas mengganti nama file, secara individual.Dari
rename
util-linux yang Anda sebutkan membuat pergantian string sederhana, misalnyarename foo bar *
akan berubahfoobar
menjadibarbar
, danasdffoo
menjadiasdfbar
. Namun, itu tidak mengambil ekspresi reguler!Utilitas Perl rename ( atau berbagai contohnya ) mengambil ekspresi Perl untuk mengubah nama file. Satu kemungkinan besar akan menggunakan perintah, di mana polanya adalah ekspresi reguler.
s/pattern/replacement/
Baik rename-linux rename dan Perl rename dapat digunakan untuk memindahkan file ke direktori lain secara bersamaan, dengan membuat perubahan yang sesuai pada nama file, tetapi agak canggung. Juga tidak lebih dari memanggil
rename()
file, jadi pindah dari satu sistem file ke yang lain tidak berfungsi.Adapun yang
rename
Anda miliki, mungkin tergantung pada distribusi Anda , dan / atau apa yang telah Anda instal. Sebagian besar dari mereka mendukungrename --version
, jadi gunakan itu untuk mengidentifikasi mana yang Anda miliki.sumber
rename '$_=lc' *
Untuk mengurangi nama file. Tapi saya pikir kasus yang paling umum adalah menggunakans///
(yang saya sebutkan) dan bagian pola itu adalah sebuah regex; Saya tidak berpikir Anda dapat menggunakan fungsi di sana. Anda bisa melakukannya di bagian pengganti.rename.ul
adalah dan akan untuk versi util-linux, dan bukan untuk yang lain.man rename
sehingga akan lebih baik untuk mengetahui pemahaman Anda tentang contoh debianrename foo foo0 foo?; rename foo foo0 foo??
contoh, karena itulah satu-satunya perbedaan antara dua halaman manual yang saya lihat. Sepasang perintah itu berfungsi karena yang pertama menambahkan nol pada nama-nama setiap nama file satu digit, dan setelah itu, yang kedua menambahkan (yang lain) nol setiap nama file dua digit. Set kedua termasuk file yang diubah namanya oleh perintah pertama. Menggunakanrename foo foo00 foo?
sebagai perintah pertama juga berfungsi, itu hanya menambahkan dua nol sekaligus.mv
cukup mengubah nama file (itu juga dapat memindahkannya ke sistem file lain atau path). Anda memberinya nama lama dan nama baru, dan itu mengubah file ke nama atau lokasi baru.rename
digunakan untuk membuat perubahan penamaan massal. Katakanlah Anda memiliki seribu file,foo000.log
melaluifoo999.log
dan Anda ingin mengubahnya kebar000.log
melaluinyabar999.log
. Denganmv
Anda harus melakukanmv foo000.log bar000.log
,mv foo001 bar001.log
, dll atau menulis naskah. Denganrename
Anda lakukanrename foo bar foo*.log
, dan voila, seribu file diubah dalam sekejap! Cukup keren. Periksa kembaliman rename
halaman tersebut untuk detailnya.sumber
mv
Ini adalah baris perintah dasar yang dirancang untuk melakukan satu hal dan melakukannya dengan baik (filsafat Unix): memindahkan file atau direktur .
Anda dapat meretas
STDOUT
&STDIN
¹ untuk memodifikasi dengan cepat string tujuan, tetapi itu bukan peretasan yang cerdasrename (salah satu Perl)
Ada alat lain dengan nama yang sama yang mungkin atau mungkin tidak dapat melakukan ini, jadi berhati-hatilah.
Ketika orang berbicara tentang
rename
, kita berpikir tentang yang ini, bukan yangELF
, kurang kuat (sihir?).Ini tidak mendasar, ini Perl. Anda dapat melewati beberapa fungsi Perl di dalam, dan ini sangat kuat.
Pertimbangkan contoh ini:
Anda ingin mengubah nama banyak file
Anda dapat menambahkan nol ke digit dengan
sprintf()
seperti ini (menggunakan regex, heh, ini Perl: D):Sekarang kamu punya :
Bukan perintah dasar, bukan?
rename sebenarnya tidak dirancang untuk memindahkan dir , tetapi ia dapat melakukannya:
File yang dipindahkan
¹ beberapa kode yang kita lihat di
*.stackexchange.*
situs webIni bukan cara untuk pergi , itu kereta biasa, hanya untuk menjelaskan mengapa menggunakan alat yang tepat pada saat yang tepat
sumber
sprintf
dengan mengganti namamv memindahkan atau mengganti nama file dan direktori dan akan mencadangkannya; ganti nama saja ganti nama file.
mv memiliki lebih banyak kemampuan dan opsi. Lihat sakelar di halaman manual untuk masing-masing untuk melihat perbedaan kemampuan. Mari kita lihat menggunakan man di Ubuntu 18.04LTS (jarak tempuh Anda dapat bervariasi tergantung pada versi setiap paket):
opsi mv (menghilangkan bantuan dan versi)
ganti nama opsi (menghilangkan bantuan dan versi)
sumber