'Rename' ve 'mv' arasındaki fark nedir?


12

Tamamen bana belli değil, ama arasındaki fark nedir mvve rename(dan util-linux-ng 2.17.2olarak /usr/bin/rename)? renameDüzenli ifadeleri kabul etmenin ötesinde bir diğerinin avantajları var mı mvdeğil mi? Ben renamede aynı anda birden fazla dosya yeniden adlarını işleyebilir inanıyorum , oysa mvbunu yapmaz.

manSayfalarında onları başka ne ayıracağını veya kendi başıma biraz araştırma yaparak net bir gösterge bulamadım .


2
Aynı şeylerden bahsettiğimizden emin olalım; çıktılar nelerdir type -a renameve rename --version?
Jeff Schaller

@JeffSchaller Bu benim için daha çok bir merak, ama benim * nix makinelerimden birinde rename is /usr/bin/renameve rename (util-linux-ng 2.17.2)sırasıyla.
Urda

6
Orada birkaç farklı yeniden adlandırma vardır ve bu bir takma ad / işlev / komut dosyası olabilir, bu yüzden sadece ne olduğunu bildiğimizden emin olmak istedim. Teşekkür ederim! Lütfen bu çıktıları sorunuza göre düzenlemekten çekinmeyin.
Jeff Schaller

@JeffSchaller endişelenmeyin, aslında bu bağlantı , renamefarklı dağıtımlarda farklı şeyler ifade edebileceğimi gösteren bir bağlantıydı .
Urda

5
Sorunuz cevabını içeriyor gibi görünüyor. “Bir jet ve üç tekerlekli bisiklet arasındaki fark, bir jetin uçabilmesi ve binlerce kat daha hızlı gidebilmesinden başka ne?” :-) ⁠
G-Man

Yanıtlar:


21

Temelde her ikisi için de kapakta söyledikleridir.

mvStandart bir yardımcı programdır için hareket belirli bir hedefe, bir veya daha fazla dosya. Taşınacak tek bir dosya varsa, bir dosyayı yeniden adlandırmak için kullanılabilir. Birkaç tane varsa, mvyalnızca hedef dizinse çalışır ve dosyaları oraya taşır.

Yani mv foo barher iki dosyayı hareket edecek foodizine bar(varsa) veya yeniden adlandırmak fooiçin bar(eğer baryok veya bir dizin değil etmez). mv foo1 foo2 barher iki dosyayı da dizine taşır barya da barbir dizin değilse şikayet eder .

mvrename()dosyaları taşımak için C kitaplığı işlevini çağırır ve bu işe yaramazsa (başka bir dosya sistemine taşınıyorsa), dosyaları kopyalar ve orijinalleri kaldırır.

Sahip olduğunuz tek şey varsa mvve birden çok dosyayı yeniden adlandırmak istiyorsanız, bir kabuk döngüsü kullanmanız gerekir. Burada sitedeki sorulardan vardır, örneğin bkz bu , bu , ve diğerleri .


Öte yandan, çeşitli renameyardımcı programlar dosyaları tek tek yeniden adlandırır .

renameUtil-linux dan basit bir dizge ikame yapar bahsetmek, mesela rename foo bar *değişirdi foobariçin barbarve asdffooiçin asdfbar. O mu değil , ancak, normal bir ifade almak!

Perl yeniden adlandırma yardımcı programı ( veya çeşitli örnekleri ) dosya adlarını dönüştürmek için bir Perl ifadesi alır. Bir büyük olasılıkla bir kullanacak komutu, desen olan normal bir ifade.s/pattern/replacement/

Hem util-linux yeniden adlandırması hem de Perl yeniden adlandırması, dosya adında uygun değişiklikler yapılarak dosyaları aynı anda başka bir dizine taşımak için kullanılabilir, ancak biraz gariptir. İkisi rename()de dosyaları çağırmaktan fazlasını yapmaz , bu nedenle bir dosya sisteminden diğerine geçmek işe yaramaz.

Sahip renameolduğunuza göre, dağıtımınıza ve / veya ne yüklediğinize bağlı olabilir. Çoğu destekliyor rename --version, bu yüzden hangisine sahip olduğunuzu tanımlamak için bunu kullanın.


Sadece 'düzenli ifade' değil, ihtiyaç duyulduğunda da işlev görür
Gilles Quenot

@GillesQuenot, evet, örneğin rename '$_=lc' *dosya adlarını küçük harflerle yapabilirsiniz . Ama bence en yaygın durum s///(bahsettiğim) kullanmaktır ve bunun kalıp kısmı bir normaldir; Orada bir işlev kullanabileceğinizi sanmıyorum. Yine de yedek parçada yapabilirsiniz.
ilkkachu

@MyWrathAcademia, Man sayfasındaki ilk örnek benim için çalışıyor (işleri diğerinden farklı yapıyor). Ayrıca, Debian'ın manajlarına bağlanma nedenim, en azından orada man sayfasının rename.uldiğerlerinin değil, util-linux sürümü için olduğu ve olacağı çok açık olduğu .
ilkkachu

@ilkkachu, cevabınızda veya bir yorumda bu ilk örneğe bir açıklama eklemeyi düşünür müsünüz? Bu örnekten farklıdır, bu man renameyüzden debian örneği hakkındaki anlayışınızı bilmek iyi olur
MyWrathAcademia

@MyWrathAcademia, rename foo foo0 foo?; rename foo foo0 foo??örnek demek istediğini sanıyordum, çünkü gördüğüm iki sayfa arasındaki tek fark buydu . Bu komut çifti işe yarar çünkü ilki her tek basamaklı dosya adının adlarına sıfır ekler ve bundan sonra ikincisi her iki basamaklı dosya adını sıfır (başka) ekler. Bu ikinci set, ilk komutla yeniden adlandırılan dosyaları içerir. Kullanılması rename foo foo00 foo?ilk komut da çalışır şekilde, sadece bir seferde iki sıfır ekler.
ilkkachu

2

mvdosyanın adını değiştirir (dosyayı başka bir dosya sistemine veya yola da taşıyabilir). Eski bir ad ve yeni bir ad verirsiniz ve dosyayı yeni ad veya konuma değiştirir. renametoplu adlandırma değişiklikleri yapmak için kullanılır. Söyleyin, bin dosya vardı foo000.logaracılığıyla foo999.logve onları değiştirmek istedim bar000.logyoluyla bar999.log. İle mvyapmanız gerekirdi mv foo000.log bar000.log, mv foo001 bar001.logvb ya da başka bir senaryo yazmak. İle renamebasitçe yapmak rename foo bar foo*.log, işte ve bin dosyaları anında değiştirilir! Oldukça havalı. man renameAyrıntılar için sayfayı tekrar kontrol edin .


2

mv

Bir şeyi yapmak ve iyi yapmak için tasarlanmış temel bir komut satırıdır (Unix felsefesi): dosyaları veya dizinleri taşıyın .

Hedef dizgiyi anında değiştirmek için hack STDOUT& can yapabilirsiniz STDIN, ancak bu sadece akıllı bir hack değildir

yeniden adlandır (Perl's one)

uyarı Bunu yapabilen veya yapamayan aynı ada sahip başka araçlar da vardır, bu yüzden dikkatli olun.

İnsanlar hakkında konuştuğunda rename, bunu düşünüyoruz ELF, daha az güçlü (sihir?) Değil .

Temel değil, Perl. Bazı Perl işlevlerini içeri aktarabilirsiniz ve son derece güçlüdür.

Bu örneği düşünün:

Gibi bir grup dosyayı yeniden adlandırmak istiyorsunuz

foobar_1.txt
foobar_2.txt
foobar_3.txt

Bu şekilde rakamlara sıfırlar ekleyebilirsiniz sprintf()(regex, heh, Perl: D kullanarak):

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

Şimdi:

foobar_0001.txt
foobar_0002.txt
foobar_0003.txt

Gerçekten basit bir komut değil, değil mi?

gerçekten dizin (ler) i taşımak için tasarlanmamıştır , ancak bunu yapabilir:

$ 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

Taşınan dosya

/tmp/file

Websites *.stackexchange.*web sitelerinde gördüğümüz bazı kodlar

resim açıklamasını buraya girin

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

Bu doğru yolun neden doğru anda kullanıldığını açıklamak için gitmenin yolu değil, düz bir hata.


sprintfRename ile ing için +1
Archemar

-1

mv dosyaları ve dizinleri taşır veya yeniden adlandırır ve yedekler; rename sadece dosyaları yeniden adlandırır.

mv daha fazla yetenek ve seçeneğe sahiptir. Yeteneklerdeki farklılıkları görmek için her biri için man sayfalarındaki anahtarlara bakın. Ubuntu 18.04LTS'deki adamı kullanarak bir göz atalım (kilometreniz, her paketin sürümüne bağlı olarak değişebilir):

mv seçenekleri (yardım ve sürüm atlanıyor)

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

seçenekleri yeniden adlandırma (yardım ve sürüm atlanıyor)

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

3
'Daha güçlü' tanımlayın. Mv regex'i yeniden adlandırma gibi destekliyor mu?
Gilles Quenot

Sorucının belirttiği gibi, hayır.
K7AAY

2
Vay be, ne bir tartışma
Gilles Quenot

1
Kredinin vadesi geldiği yerde kredi verilmesi.
K7AAY
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.