Soru Unix'te birden çok dosyayı yeniden adlandır


Bir dizinde önek fgh ile başlayan birden çok dosya vardır, örneğin:

fghfilea
fghfileb
fghfilec

Önek jkl ile başlamak için hepsini yeniden adlandırmak istiyorum. Her dosyayı tek tek yeniden adlandırmak yerine bunu yapmak için tek bir komut var mı?


179
2017-07-06 11:21


Menşei


burayı kontrol et:theunixshell.blogspot.com/2013/01/... - Vijay
İlgili soru: Birden çok paterne dayalı dosyaları yeniden adlandırmanın daha iyi yolu. - Michael Le Barbier Grünewald


Cevaplar:


Birkaç yol var, ama rename Muhtemelen en kolay olacak.

Bir sürümü kullanarak rename:

rename 's/^fgh/jkl/' fgh*

Başka bir sürümünü kullanma rename (ile aynı Judy2K'nın cevabı):

rename fgh jkl fgh*

Yukarıdakilerden hangisinin geçerli olduğunu görmek için platformunuzun man sayfasını kontrol etmelisiniz.


233
2017-07-06 11:24



+1 Yeniden adlandırmak bile bilmiyordu ... Şimdi mv ve sed ile bir döngü kullanmayı bırakabilirim ... Teşekkürler! - balpha♦
Farklı bir bağlantı kuruyorsun rename o zaman sen için sözdizimi gösteriyorsun unixhelp.ed.ac.uk/CGI/man-cgi?renamediğeri - Hasturkun
Tüm * nix sistemlerinde bulunmaz. Biri için Max OS X'de değil ve bunu almak için fink'teki hiçbir paket yok. MacPorts'a bakma. - dmckee
AFAICT rename Linux özel bir betik veya yardımcı program gibi görünüyor. Taşınabilirlik hakkında her şeye dikkat ederseniz, lütfen kullanmaya devam edin sed ve döngüler veya satır içi Perl betiği. - D.Shawley
brew install rename OS X'de :) - sam


Bu nasıl sed ve mv yeniden adlandırmak için birlikte kullanılabilir:

for f in fgh*; do mv "$f" $(echo "$f" | sed 's/^fgh/jkl/g'); done

Aşağıdaki yorumlara göre, dosya adlarında boşluk varsa, tırnak işaretleri gerekebilir. kuşatma dosyaları taşımak için adı döndüren alt işlev

for f in fgh*; do mv "$f" "$(echo $f | sed 's/^fgh/jkl/g')"; done

95
2017-07-06 11:38



Çok yakın. Sadece fgh: 's / ^ fgh / jkl / g' nin ilk oluşumunu eşleştirmek istediğinizi unutmayın (The caret, tüm farkı yaratır). - Stephan202
Sadece hassaslık uğruna ... "Adın başlangıcında" demek, "ilk fgh" olayını değil. / ^ fgh / "fghi" ile eşleşecek, ancak "efgh" değil. - Dave Sherohman
@Stephan, Bu benim bölümümde bir yazım hatasıydı (düzeltildi). - nik
Eğer "yeniden adlandır" için erişiminiz yoksa bu harika çalışıyor. Dosya adlarınız boşluk içeriyorsa kod tırnak gerektirebilir. for f in fgh*; do mv "$f" "$(echo $f | sed 's/^fgh/jkl/g')"; done - Dave Nelson
@nik Tırnaklar olmadan bu dosyaların listesini yeniden adlandırmak bir hata yapar: touch fghfilea fghfileb fghfilec fghfile\ d. @DaveNelson sözlerini dikkate almanızı öneriyorum. - luissquall


yeniden adlandırmak her sistemde olmayabilir. eğer sahip değilseniz, kabuğu kullanın bu örnek bash kabuğunda

for f in fgh*; do mv "$f" "${f/fgh/xxx}";done

65
2017-07-07 02:22



Bu çözümde sed komut gerekli değildir. Bu, nik'in cevabından daha basit. - Halil
xxx değiştirmeyi mi temsil ediyor? Orijinal posterin durumunda, bu "jkl" olurdu - Awinad
Hepsinin en temiz çözümü. - M T Head


kullanma mmv:

mmv "fgh*" "jkl#1"

34
2017-11-21 11:17



Vay, bu problemi çözmek için mükemmel ve basit bir yol! Mmv tanıtıldı sevindim, teşekkürler! - Hendeca
Teşekkürler!!! Daha önce mmv'yi hiç duymamıştım. Sadece yüklü ve onunla oynuyordum - basit, güçlü. - Nick Rice
toplu yeniden adlandırmak istiyorsanız kullanmak ; ile birlikte #1. örnek: mmv ";fgh*" "#1jkl#2" - Alp
Çok şık bir çözüm! - Will
Tam olarak ihtiyacım olan şey. 'İle grup çek've onları # 1, # 2, ... EX ile geri çağır. EX: mmv "show ep 1080p. * "" My.show. # 1. # 2 "= my.show.001.avi - Lundy


Bunu yapmanın birçok yolu vardır (bunların tümü, tüm unixy sistemlerinde çalışmaz):

  • ls | cut -c4- | xargs -I§ mv fgh§ jkl§

    § Uygun bulduğunuz herhangi bir şeyle değiştirilebilir. Bunu yapabilirsin find -exec ama bu, birçok sistemde çok farklı davranıyor, bu yüzden genellikle bundan kaçınıyorum

  • for f in fgh*; do mv "$f" "${f/fgh/jkl}";done 

    Ham ama dedikleri gibi etkili

  • rename 's/^fgh/jkl/' fgh*

    Gerçek güzel, ama adsız en yaygın unix sistemi afaik olan BSD üzerinde mevcut değildir.

  • rename fgh jkl fgh*

  • ls | perl -ne 'chomp; next unless -e; $o = $_; s/fgh/jkl/; next if -e; rename $o, $_';

    Perl'i kullanmakta ısrar ederseniz, ancak sisteminizde yeniden adlandırılamazsa, bu canavarı kullanabilirsiniz.

Bunlardan bazıları biraz sarsılmış ve liste tam olmaktan uzak, ama tüm unix sistemleri için burada ne istediğinizi bulacaksınız.


17
2017-10-12 09:41



Bu tür bir canavarı seviyorum! - lefakir
evet, hala perl için zayıf bir nokta var :) - iwein
Bunu not et ls çıktı ayrıştırılmamalı ve / veya pipetlenmemelidir - phuclv
Perl canavarı, dosya isimlerinde boşluk varsa, kusursuz bir şekilde çalışır. - mlerley


rename fgh jkl fgh*

10
2017-07-06 11:28



Makinemde bu, "Bareword" fgh "hatası verirken" katı alt "(status 1) satır 1'de kullanılmasına izin verilmez. - Stephan202
@ Stephan202, makinen nedir? - nik
Ubuntu 8.10 (perl v5.10.0 / 2009-06-26) - Stephan202
@ Stephan202 Aynı sorunu yaşıyorum, çözdünüz mü? (7 yıl sonra) - whossname
@whossname: Üzgünüm, gerçekten hatırlayamıyorum. (Tatil nedeniyle yavaş cevap.) - Stephan202


kullanma find, xargs ve sed:

find . -name "fgh*" -type f -print0 | xargs -0 -I {} sh -c 'mv "{}" "$(dirname "{}")/`echo $(basename "{}") | sed 's/^fgh/jkl/g'`"'

Daha karmaşık @ nik'in çözümü ancak dosyaları tekrar tekrar adlandırmaya izin verir. Örneğin, yapı

.
├── fghdir
│   ├── fdhfilea
│   └── fghfilea
├── fghfile\ e
├── fghfilea
├── fghfileb
├── fghfilec
└── other
    ├── fghfile\ e
    ├── fghfilea
    ├── fghfileb
    └── fghfilec

buna dönüştürülecek,

.
├── fghdir
│   ├── fdhfilea
│   └── jklfilea
├── jklfile\ e
├── jklfilea
├── jklfileb
├── jklfilec
└── other
    ├── jklfile\ e
    ├── jklfilea
    ├── jklfileb
    └── jklfilec

Çalışması için anahtar xargs yapmak kabuğu xargs'dan çağır.


7
2018-06-02 22:03



Böyle bir şey yayınlayacaktım, ama doğru komutu almak için bir saatimi alacaktı. - Juan Mendes


Perl'i yüklemek için Adını değiştirmek senaryo:

sudo cpan install File::Rename

Var iki isim Stephan202'nin cevabındaki yorumlarda belirtildiği gibi. Debian tabanlı dağıtımlar Perl yeniden adlandır. Redhat / dev / dak dağıtımları C yeniden adlandır.
OS X'in varsayılan olarak bir tane yüklü olmadığı (en az 10.8'de), Windows / Cygwin de yoktur.


3
2018-05-14 14:02





Solaris'te şunları deneyebilirsiniz:

for file in `find ./ -name "*TextForRename*"`; do 
    mv -f "$file" "${file/TextForRename/NewText}"
done

3
2017-12-23 11:41





Bu problemi çözen kendi senaretimizi kullanmanızı tavsiye ederim. Ayrıca, dosya adlarının kodlamasını değiştirmek ve aksamları birleştirerek önceden oluşturulmuş karakterleri birleştirmek için seçenekleri de vardır; bu, Mac'imdeki dosyaları kopyaladığımda her zaman sahip olduğum bir sorundur.

https://github.com/kugland/rename.pl/blob/master/rename.pl


2
2017-11-01 11:26



Bunu not et sadece bağlantıya verilen cevaplar cesaretsizdir, SO cevapları bir çözüm arayışının son noktası olmalıdır (zaman içinde bayat eğilimi olan referansların bir başka durağanlığı gibi). Lütfen bağlantıyı referans olarak tutarak, burada tek başına bir özet eklemeyi düşünün. - kleopatra


#!/bin/sh

#replace all files ended witn .f77 to .f90 in a directory

for filename in *.f77

do 

    #echo $filename
    #b= echo $filename | cut -d. -f1
    #echo $b    
    mv ${filename} ${filename%.f77}.f90

#print $?

done

2
2018-06-23 09:02