Her şeyi büyük harfe yinelemeli olarak yeniden adlandırmak için yeniden adlandırmayı nasıl kullanabilirim?


11

Tüm dosya ve klasörleri (alt klasörleri) tekrar tekrar büyük harfe dönüştürmek istiyorum.

Küçük harfe dönüştürecek bazı komut dosyaları buldum, ancak bunları nasıl değiştireceğimi bilmiyorum, bu yüzden başka şekilde (alttan üste) yapacak.

Bulduğum ve küçük harfle çalıştığım komut dosyası, ancak nasıl değiştirileceğini bilmiyordum:

rename 'y/A-Z/a-z/' *

Gelen man rename.


Yeniden adlandır komutu hakkında hiçbir şey bilmeden, denerseniz, rename 'y/a-z/A-Z/' *istediğinizi alacağınızdan şüpheleniyorum . Nerede test ettiğine dikkat et.
Warwick

özyinelemeli değil (çünkü başlangıçtaki değildi ...) ama işe yarıyor. Neden o miself'de düşünmediğimi anlayamıyorum :), teşekkürler!
jnhghy - Alexandru Jantea

Gilles'in cevabının niteliği göz önüne alındığında, cevabını benimkini tercih ederseniz kabul etmenin iyi olacağını düşünüyorum. Benimkinden çok daha eksiksiz ve seçeneklerinizi (ve hepsinin nasıl çalıştığını) açıklıyor. Teşekkürler.
Warwick

Yanıtlar:


8

Debian ve türevleri tarafından dağıtılan Perl betiğinirename kullandığınızı unutmayın (Ubuntu, Mint,…). Diğer Linux dağıtımları tamamen farklı ve daha az kullanışlı bir komut olarak adlandırılır rename.

y/A-Z/a-z/aralıktaki her bir karakteri çevirir Ayoluyla Zaralığında karşılık gelen karakteri içine aaracılığıyla z, ilgili küçük harfe yani ASCII büyük harf. Ters çeviriyi yapmak için tuşunu kullanın y/a-z/A-Z/. Aynı komutu olduğunu yazmak için başka bir yol rename '$_ = uc($_)' *ucolan u pper c ase fonksiyon ve renamekomut yapılan dönüşüm dayalı dosyaları yeniden adlandırır $_değişken.

rename '…' *sadece geçerli dizindeki dosyaları yeniden adlandırır, çünkü *eşleşen budur. Nokta dosyaları (adı ile başlayan dosyalar .) da atlanır.

Geçerli dizindeki ve alt dizinlerdeki dosyaları yinelemeli olarak yeniden adlandırmak isterseniz find, geçerli dizini yinelemeli olarak taramak için komutu kullanabilirsiniz . Burada bir zorluk var: eğer ararsanız rename, bu hem dizini hem de temel isim bölümünü yeniden adlandırır. Eğer ararsanız renamebunun (içine recursing önce dizin find -exec rename … {} \;), findbu en bir dizin bulduk çünkü karıştı ama bu dizin artık içine inerek çalışır zaman var olur. Sen anlatarak bu çalışabilirsiniz findharekete geçmeden önce bir dizin çapraz geçiş, ancak daha sonra yeniden adlandırmak girişiminde sona foo/barkadar FOO/BARancak dizin FOOmevcut değil.

Bu zorluktan kaçınmanın basit bir yolu, yeniden adlandırma komutunun yalnızca yolun temel adında hareket etmesini sağlamaktır. Normal ifade ([^/]*\Z), yolun a içermeyen son bölümüyle eşleşir /.

find . -depth -exec rename 's!([^/]*\Z)!uc($1)!e' {} +

Kabuk zsh , yeniden adlandırmak için daha kullanışlı özellikler sunar - Perl'den bile daha şifreli, ancak ters ve genellikle daha kolay oluşturulabilir.

İşlev zmvdosyaları kalıplara göre yeniden adlandırır. autoload -U zmvEtkinleştirmek için bir kez çalıştırın (bu satırı kendi bölgenize koyun .zshrc).

zmv(Değiştirilecek desen) ile ilgili ilk argümanda , zsh'ın güçlü joker desenlerini kullanabilirsiniz . zmv(Değiştirilen metin) ile ilgili ikinci bağımsız değişkende , geçmiş değiştiricileri de dahil olmak üzere parametre genişletme özelliklerini kullanabilirsiniz .

zmv -w '**/*' '$1$2:u'

Açıklama:

  • -w - her joker karakter desenine otomatik olarak sayısal değişkenler atama
  • **/*- alt dizinlerdeki tüm dosyalar, özyinelemeli (alt dizinlerin **/0, 1 veya daha fazla düzeyiyle eşleşir)
  • $1 - burada her yolun dizin kısmı ile eşleşen ilk sayısal değişken
  • $2:u- burada :udeğeri büyük harfe dönüştürmek için değiştiriciyle birlikte her yolun temel ad bölümünü eşleştiren ikinci sayısal değişken

Ek bir avantaj olarak, bu, ortam yerel ayarlarına uyar.

Yazdığınız bir zmvkomuttan emin değilseniz -n, komutun ne yapacağını yazdırma seçeneğini değiştirebilir ve hiçbir şeyi değiştiremezsiniz. Çıkışı kontrol edin ve istediğiniz şeyi yaparsa, -ngerçekte işlem yapmadan komutu yeniden çalıştırın .


5

Gilles dan (küçük düzenleme ile) Çalıntı sonrası burada

find <DIR> -depth -type d -exec rename -n 's!/([^/]*/?)$!\U/$1!' {} +


Bu yinelemeli olarak hareket etmez.
Gilles 'SO- kötü olmayı kes

Doğru. Soruyu doğru okumalıydım. Yeniden adlandırma komutuna erişimim yok, ancak bunun yinelemeli olarak çalışacağına inanıyorum -find <dir> -exec rename 'y/a-z/A-Z/' {} \;
Warwick

Bundan biraz daha karmaşık, çünkü dizinleri findtekrarlarken dizinleri yeniden adlandırıyorsunuz .
Gilles 'SO- kötü olmayı kes

@Gilles - Tamam. Biraz araştırma yaptıktan sonra dizin adlarının son işlenmesini sağlamak için -depth seçeneğini eklemem gerekiyor gibi görünüyor. Bu yüzden find <dir> -depth -exec rename 'y/a-z/A-Z/' {} \;yeniden adlandırma dizinleri sorunu ele gerekir. Doğru?
Warwick

Hayır, bu hala çünkü değil çalışır renamedeğişiklikler örneğin foo/baretmek FOO/BARve FOObu noktada yok.
Gilles 'SO- kötü olmayı kes

2

Hala bu cevaba bağlı olan herkesi Guiles Quernot'un gerektirmeyen bu soruya verdiği mükemmel cevaba yönlendirmek istiyorum find.

Ortaya çıkan komut şöyle olacaktır:

shopt -s globstar
rename -n 'y/a-z/A-Z/' **

Ama çalıştırmadan önce lütfen eski bash versiyonları ile ilgili uyarılar için verilen cevabı okuyun.

Sonunda birisi y///komutun ne yaptığını merak ediyorsa perl regex. İşte ilgili belgelere bir bağlantı .


1

find -execdir| Adını değiştirmek

Göreceli yol deliliği için olmasaydı bunu yapmanın en iyi yolu olurdu, çünkü Perl regex fu'nun sadece taban adına etki etmesini önler:

PATH="$(echo "$PATH" | sed -E 's/(^|:)[^\/][^:]*//g')" \
  find a -depth -execdir rename 's/(.*)/\U$1/' '{}' \;

-execdirİlk cdyalnızca basename üzerinde çalıştırmadan önce dizine s.

Ne yazık ki, o PATHhack bölümünden kurtulamıyorum, find -execdirgöreceli bir yolunuz varsa hiçbir şey yapmayı reddediyorum PATH...: /ubuntu/621132/why-using-the-execdir-action- is-güvensiz-için-dizinine-olan-in-the-yolu / 1109378 # 1109378


0

Dosyaları yeniden adlandırmak istediğiniz dizine geçtikten sonra bunu deneyin:

for word in `ls -ltr |tail -n +2 |awk '{print $9}'`
do
  a=$(echo $word | tr '[a-z]' '[A-Z]')
  mv $word $a
  echo "Done Successfully"
done

Ls çıkışını ayrıştırmayın (ve neden ls -lsadece isim dışında sütunları kesmek için yeryüzünde koştunuz ?) Ve değişken ikameler etrafında çift tırnak kullanın . Kodunuz aşırı karmaşıktır ve boşluk ve diğer özel karakterleri içeren dosya adlarını kırar. Kullanın findveya **/alt dizinlere geri almak için, çıktı lssadece insan tüketimi içindir.
Gilles 'SO- kötü olmayı kes
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.