Apa perbedaan antara 'rename' dan 'mv'?

12

Tidak sepenuhnya jelas bagi saya, tetapi apa perbedaan antara mvdan rename(dari util-linux-ng 2.17.2as /usr/bin/rename)? Apakah ada kelebihan satu di atas yang lain di luar renamemenerima ekspresi reguler dan mvtidak? Saya percaya renamejuga dapat menangani beberapa nama file sekaligus, sedangkan mvtidak melakukan ini.

Saya tidak dapat menemukan indikasi yang jelas di manhalaman mereka apa lagi yang membedakan mereka atau melalui investigasi sendiri.

Urda
sumber
2
Mari kita pastikan kita membicarakan hal yang sama; apa output dari type -a renamedan rename --version?
Jeff Schaller
@JeffSchaller Ini lebih merupakan keingintahuan pada bagian saya, tetapi pada salah satu dari mesin * nix saya, saya mendapatkan rename is /usr/bin/renamedan rename (util-linux-ng 2.17.2)masing - masing.
Urda
6
Ada beberapa nama yang berbeda di luar sana , dan itu bisa berupa alias / fungsi / skrip, jadi saya hanya ingin memastikan kami tahu apa itu. Terima kasih! Silakan mengedit hasil tersebut ke dalam pertanyaan Anda.
Jeff Schaller
@JeffSchaller jangan khawatir, sebenarnya tautan ini adalah salah satu yang baru saja saya temukan yang menunjukkan kepada saya bahwa ada renamehal-hal berbeda di distro yang berbeda.
Urda
5
Sepertinya pertanyaan Anda mengandung jawabannya. "Apa perbedaan antara jet dan roda tiga, selain fakta bahwa jet bisa terbang , dan bisa melaju beberapa ribu kali lebih cepat?" :-) ⁠
G-Man Mengatakan 'Reinstate Monica'

Jawaban:

21

Pada dasarnya apa yang tertulis di tutupnya, untuk keduanya.

mvadalah 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, mvhanya berfungsi jika targetnya adalah direktori, dan memindahkan file ke sana.

Jadi mv foo barakan memindahkan file fooke direktori bar(jika ada), atau mengubah nama foomenjadi bar(jika bartidak ada atau tidak direktori). mv foo1 foo2 barhanya akan memindahkan kedua file ke direktori bar, atau mengeluh jika barbukan direktori.

mvakan memanggil fungsi rename()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 mvdan 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 renameutilitas mengganti nama file, secara individual.

Dari renameutil-linux yang Anda sebutkan membuat pergantian string sederhana, misalnya rename foo bar *akan berubah foobarmenjadi barbar, dan asdffoomenjadi asdfbar. 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 renameAnda miliki, mungkin tergantung pada distribusi Anda , dan / atau apa yang telah Anda instal. Sebagian besar dari mereka mendukung rename --version, jadi gunakan itu untuk mengidentifikasi mana yang Anda miliki.

ilkkachu
sumber
Tidak hanya 'ekspresi reguler' tetapi berfungsi jika membutuhkannya
Gilles Quenot
@ GillesQuenot, well, yeah, Anda bisa melakukan mis. rename '$_=lc' *Untuk mengurangi nama file. Tapi saya pikir kasus yang paling umum adalah menggunakan s///(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.
ilkkachu
@MyWrathAcademia, Contoh pertama di halaman manual bekerja untuk saya (hanya melakukan hal-hal yang berbeda dari yang lain). Juga, alasan saya menautkan ke halaman manual Debian adalah bahwa setidaknya di sana dibuat sangat jelas bahwa halaman manual untuk rename.uladalah dan akan untuk versi util-linux, dan bukan untuk yang lain.
ilkkachu
@ilkkachu, apakah Anda keberatan menambahkan penjelasan untuk contoh pertama itu baik dalam jawaban Anda atau dalam komentar. Ini berbeda dari contoh di man renamesehingga akan lebih baik untuk mengetahui pemahaman Anda tentang contoh debian
MyWrathAcademia
@MyWrathAcademia, saya berasumsi maksud Anda rename 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. Menggunakan rename foo foo00 foo?sebagai perintah pertama juga berfungsi, itu hanya menambahkan dua nol sekaligus.
ilkkachu
2

mvcukup 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. renamedigunakan untuk membuat perubahan penamaan massal. Katakanlah Anda memiliki seribu file, foo000.logmelalui foo999.logdan Anda ingin mengubahnya ke bar000.logmelaluinya bar999.log. Dengan mvAnda harus melakukan mv foo000.log bar000.log, mv foo001 bar001.log, dll atau menulis naskah. Dengan renameAnda lakukan rename foo bar foo*.log, dan voila, seribu file diubah dalam sekejap! Cukup keren. Periksa kembali man renamehalaman tersebut untuk detailnya.

eewanco
sumber
2

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 cerdas

rename (salah satu Perl)

peringatan 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 yang ELF, 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

foobar_1.txt
foobar_2.txt
foobar_3.txt

Anda dapat menambahkan nol ke digit dengan sprintf()seperti ini (menggunakan regex, heh, ini Perl: D):

rename 's/(\d+)/sprintf("%04d", $1)/e' foobar_*.txt

Sekarang kamu punya :

foobar_0001.txt
foobar_0002.txt
foobar_0003.txt

Bukan perintah dasar, bukan?

sebenarnya tidak dirancang untuk memindahkan dir , tetapi ia dapat melakukannya:

$ mkdir -p /tmp/foo/bar/base
$ touch /tmp/foo/bar/base/file
$ rename 's!/tmp/foo/bar/base/file!/tmp/file!' /tmp/foo/bar/base/file

File yang dipindahkan

/tmp/file

¹ beberapa kode yang kita lihat di *.stackexchange.*situs web

masukkan deskripsi gambar di sini

for FILE in `ls *.txt`
do
    mv ${FILE} `echo ${FILE} | sed 's/anything_ugly/anything_still_ugly/'`
done

Ini bukan cara untuk pergi , itu kereta biasa, hanya untuk menjelaskan mengapa menggunakan alat yang tepat pada saat yang tepat

Gilles Quenot
sumber
+1 untuk masuk sprintfdengan mengganti nama
Archemar
-1

mv 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)

   --backup[=CONTROL]  
          make a backup of each existing destination file  

   -b     like --backup but does not accept an argument  

   -f, --force  
          do not prompt before overwriting  

   -i, --interactive  
          prompt before overwrite  

   -n, --no-clobber  
          do not overwrite an existing file  

  If you specify more than one of -i, -f, -n, only the final one takes effect.  

   --strip-trailing-slashes  
          remove any trailing slashes from each SOURCE argument  

   -S, --suffix=SUFFIX  
          override the usual backup suffix  

   -t, --target-directory=DIRECTORY  
          move all SOURCE arguments into DIRECTORY  

   -T, --no-target-directory  
          treat DEST as a normal file  

   -u, --update  
          move only when the SOURCE file is newer than the destination file or when the destination file is missing  

   -v, --verbose  
          explain what is being done  

   -Z, --context  
          set SELinux security context of destination file to default type  

ganti nama opsi (menghilangkan bantuan dan versi)

   -s, --symlink   
          Do not rename a symlink but its target.  

   -v, --verbose  
          Show which files where renamed, if any.  

   -n, --no-act  
          Do not make any changes.  

   -o, --no-overwrite  
          Do not overwrite existing files.            
K7AAY
sumber
3
Tentukan 'lebih kuat'. Apakah mv mendukung regex seperti rename?
Gilles Quenot
Seperti yang dinyatakan oleh si penanya, tidak.
K7AAY
2
Wow, argumen yang bagus
Gilles Quenot
1
Memberikan kredit saat kredit jatuh tempo.
K7AAY