Toplu dosyaları yeniden adlandırma


151

Görüntülerle dolu bir dizin var:

image0001.png
image0002.png
image0003.png
...

Ve bir astarın onları yeniden adlandırmasını istiyorum.

0001.png
0002.png
0003.png
...

Bunu nasıl yaparım?


8
Bu, Unix komut satırı SSS'lerinden biridir ve bu sitede zaten bulamıyorum, bu yüzden bu Topluluk Wiki'sini yapmalı mıyız?
Gilles,

5
Neden olduğunu anlamıyorum. Doğrulanabilir bir cevabı olan özel bir soru.
İnternet adamı,

3
Eğer X kullanıyorsanız thunar -B *.png, Thunar'ın toplu yeniden adlandırma gui aracından daha kolay olamaz .
dotjoe

@dotjoe Teşekkürler, Thunar gerçekten ilginç.
Volker Siegel

Yanıtlar:


106

Bash veya diğer POSIX uyumlu bir kabuk kullanıyorsanız:

for f in *.png; do
    mv -- "$f" "${f#image}"
done

2
Bu, Mendel Coopers Advanced Bash-komut dosyası kılavuzu tldp.org/LDP/abs/html
W_Whalley

2
@W_Whalley Wooledge Bash Rehberi'nin lehine bu rehberden kaçınmanızı şiddetle tavsiye ederim .
Wildcard

@Wildcard: ABS rehberinden kaçınmayı önerme nedenleriniz nelerdir?
Christian Severin

@HristiyanSeverin kötü uygulamaların ve tam açık kodun tanıtımını yapıyor. Profil sayfamdaki bağlantıları kontrol et.
Joker

Bu örneği farklı dosya düzenlerine nasıl uyarlayacağınızı bilmiyorsanız, yukarıda belirtilen kılavuzun Parametre Genişletme Bölümüne bakmak isteyebilirsiniz .
lex82,

108

Debian ve türevlerinde Perl'in buna renamebenzer şekilde çalıştığı sed:

  rename -v 's/image//' *.png

Orada da renamegelen util-linuxbunun yerine, bu gibi çalışır:

  rename image '' *.png

6
bunun, kurulması gerekebilecek bir perl programı olduğunu ve argüman olarak düzenli ifadeler aldığını gerçekten söylemelisin.

Ah, bunun farkında değildim. Tanımlayabildiğimde kanonik cevaba kredi vereceğim :)
İnternet adamı

5
Bu renameprogram bir Perl örnek dağıtımından geldi. Debian ve Ubuntu olarak gönderilir /usr/bin/rename. Diğer Unix değişkenleri bunu sağlayamayabilir veya tamamen farklı olabilir /usr/bin/rename.
Gilles,

1
Bazı sürümleri renametake a gelen için yedek deseni:rename [options] <expression> <replacement> <file>...
melds

1
Debian tabanlı bir sistem kullanıyorsanız, sudo apt-get install rename komutunu kullanıyorsanız, rename komutunu kullanabilirsiniz. Dosya isimleri için sed.
ctrl-alt-delor

41

ZMV

Zsh kabuğunun adı verilen güçlü bir toplu yeniden adlandırma komutu vardır zmv.

Öncelikle zmvkomutu aşağıdaki gibi etkinleştirmeniz gerekir (bu, sizin içine girebilir ~/.zshrc).

autoload zmv

Temel sözdizimi zmv PATTERN REPLACEMENT. Desen bir kabuk glob ifadesidir. Desenin bölümleri parantez içine alınabilir. Yedek metin içerebilir $1, $2desende N. parenthesised gruptan bahsedilirken, vb. Örneğin:

zmv 'image(*.png)' '$1'

Ayrıca otomatik tanımlama zsh sorabilir $1, $2desen joker karakterler eşleştirmek için, vb:

zmv -w 'image*.png' '$1.png'

4
sweeeeeeeeeeeeeeeeeet. başka bir neden de zsh öğrenmem gerekiyor.
ixtmixilix

1
@ixtmixilix ne öğrenecek? Sadece kullanmaya başlayın ve belki de bazı ekstra kadınlar için prezto ( github.com/sorin-ionescu/prezto ) ekleyin .
Gerry

Gerçekten harika, zmv'nin erkeğinde işaret ettiği gibi bu, mmv = 'noglob zmv -W' takma adının eklenmesiyle daha da basitleştirilebilir: mmv * .c.orig orig / *. C
Bretsko

zmvPrezto'yu etkinleştirmek , / / ​​.zpreztorc'daki satırın # Set the Zsh functions to load (man zshcontrib).verilmesini takiben satırın açıklanmamasını gerektirirzstyle ':prezto:load' zfunction 'zargs' 'zmv'

33

Normalde bu usecase için güzel ve basit mmv ( man sayfa ) yardımcı programını kullanın:

$ mmv "image*.png" "#1.png"

görevini yerine getirecek.

#1Hedef desen kaynak desende joker eşleşen şeyle ikame edilecektir. Bu aynı zamanda birkaç joker karakter için de geçerlidir ve örneğin dosya adlarının bölümlerinin sırasını değiştirmek için kullanılabilir. Küçük harfleri büyük harflere dönüştürmek gibi daha karmaşık işleri de kolayca yapabilirsiniz.

Alıntı yaparak kabuktaki kalıpları koruduğunuzdan emin olun.


Bu yardımcı programı işaretlediğiniz için teşekkür ederiz. Debian, Ubuntu ve Cygwin depolarında buldum. Man sayfasıyla ilgili sorun yaşadım, ancak bazı web sayfalarını ve nasıl kullandığınızı açıklamaya yardımcı olan Stack Overflow sorusunu buldum. stackoverflow.com/questions/417916/how-to-do-a-mass-rename
W_Whalley

Teşekkürler, açıklığa kavuşturmak için cevaba biraz daha bilgi ekledim.
Marcel Stimberg

3
Bunu yeterince oylayamıyorum! Çok basit ve arkadaşça. Homebrew'te OS X için kullanılabilir.
Greg Dubicki 17:17

9

Döngü için POSIX sh

Yeniden adlandırmak için sed kullanır

for i in image*jpg
do 
  mv -v "$i" "$(echo "$i" | sed -e 's/^\.\/image//' - )"
done

6

Perl'i çok seviyorum:

perl -nlE '$old=$_; s/image//; qx(mv $old $_)'

Aynı modeli, dosyaları başka bir dizine kopyalamak gibi diğer görevler için de kullanabilirsiniz:

perl -nlE '$old=$_; s(image)(/path/to/new/dir/); qx(mv $old $_)'

2
Veya (daha güvenli!):rename($old,$_)
reinierpost

5

qmv

'Den qmvgelen komut , renameutilsbir sekme ile ayrılmış, iki sütuna sahip bir dosya adı listesi gösteren bir editör açar. Her satır, her iki sütunda da aynı olan dosya adlarından birini gösterir. Sağ sütun, dosyaların yeni adlarını temsil ediyor.
Değişiklik yapmak için, sağ taraftaki adları düzenleyin. Bu örnekte :%s/...veya görsel blok modu yardımcı olabilir.

Editörünüzdeki dosya adları

$ qmv *.png

Editörde:

image0001.png           image0001.png
image0002.png           image0002.png
image0003.png           image0003.png         
~                                             
~                                             
~                                             
~                                             
"/tmp/user/1000/qmvxWyVMs" 3L, 93C

Adları sağ sütunda düzenle:
( imageÖneki görsel blok modunu kullanarak tüm satırlardan kaldırma )

image0001.png           0001.png
image0002.png           0002.png
image0003.png           0003.png         
~                                             
~                                             
~                                             
~                                             
:wq

Yeniden adlandırma günlüğü:

image0001.png -> 0001.png
image0002.png -> 0002.png
image0003.png -> 0003.png

(örneğin Ubuntu apt-get install renameutils)


3

özyinelemeli

image * png dosyalarını seçerek kolayca yinelenebilir ve dosya adlarında newline ile uğraşmaya gerek olmadığını varsayar

find . -name "image*.png" | while read f; do mv -v "$f" "$(echo "$f" | sed -e 's/^\.\/image//' - )"; done

Güvenli, boşluklarla, yeni çizgilerle, ters eğik çizgilerle ve başka şeylerle başa çıkabilir :

find . -name "image*.png" | while IFS= read -r f; do 
   mv -v "$f" "$(echo "$f" | sed -e 's/^\.\/image//' - )"; 
done

1

While döngüsünü kullanarak POSIX sh

Komuttan isimleri okumak find.

find . -maxdepth 1 -type f -name 'image*png' | while IFS= read -r f; do
  mv -v "$f" "$(echo "$f" | sed -e 's/^\.\/image//' - )"
done

Dosyadan ad okuma

while IFS= read -r f; do mv -v "$f" "$(echo "$f"|sed -e 's/^\.\/image//' - )"; done < flist


1

For Windows ve linux bu Perl komut yapacağız; bu durumda:

$ rnm -l 's/^image//' '*.png'

Senaryo, tekrarlayan bir şekilde dizinler altında çalışabilir ve hatta hepsine bir sayı hazırlayabilir:

$ rnm -r 's/^/$counter./' '/\.png$/'

UTF-8 karakterleri hem Windows hem de Linux'da doğru şekilde ele alınır.



0

Dosya adlarını deneyin ( https://github.com/shenwei356/brename ), düzenli ifade (Windows, Linux ve OS X'i destekleyen) kullanarak dosyaları / dizinleri güvenli bir şekilde toplu yeniden adlandırma için pratik bir platformlar arası komut satırı aracı.

@patrickDurusau dedi ki:

Linux'ta çeşitli toplu iş dosyası yeniden adlandırma seçenekleri var, ancak brename'de bana sıçrayan herhangi bir kısa yol görmedim.

Özellikleri:

  • Çapraz platform . Windows, Mac OS X ve Linux'u destekler.
  • Güvenli . By olası çakışmaları ve hataları denetleme .
  • Dosya filtreleme . Düzenli ifade ile dosyaları dahil etme ve hariç tutma. Gibi komutlar çalıştırmanıza gerek yok find ./ -name "*.html" -exec CMD.
  • Anahtar-değer dosyası üzerinden alt eşleşmeyi karşılık gelen değerle yeniden adlandırmak .
  • Artan tamsayı ile yeniden adlandırma .
  • Hem dosyaları hem de dizinleri tekrar tekrar adlandırın .
  • Kuru çalışmayı destekler .
  • Renkli çıktı .

Komut:

$ brename -f .png -p image
[INFO] checking: [ ok ] 'image0001.png' -> '0001.png'
[INFO] checking: [ ok ] 'image0002.png' -> '0002.png'
[INFO] checking: [ ok ] 'image0003.png' -> '0003.png'
[INFO] 3 path(s) to be renamed
[INFO] renamed: 'image0001.png' -> '0001.png'
[INFO] renamed: 'image0002.png' -> '0002.png'
[INFO] renamed: 'image0003.png' -> '0003.png'
[INFO] 3 path(s) renamed

-5

ls * png | -rf okunurken; f2 = "` echo $ f | sed -e's / image // '`"; mv $ f $ f2; tamam


Bir şey doğru değil: "mv: 'image0001.png' 'den sonra eksik hedef dosya operand'ı eksik"
İnternet adamı,

3
Kodunuzla ilgili birçok sorun var. Çıktısını ayrıştırmak lssadece sorun çağırıyor. readolmalı read -r. Tüm değişken ikameler çift tırnak içinde olmalıdır.
Gilles,

Bunu daha etkili bir şekilde yazabilirsiniz for f in *png; do f2="$(echo "$f" | sed -e 's/image//')"; mv "$f" "$f2"; done. Ayrıştırma lsne gerekli ne de iyi bir fikirdir .
kojiro
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.