Mevcut dizinlerin tüm dosya isimlerinde bir karakterin karakter dizisi nasıl değiştirilir?


41

Geçerli klasördeki tüm dosyaları / alt dizinleri nasıl yeniden adlandırırsınız?

Diyelim ki boşluk içeren birçok dosya ve alt dizilim var ve tüm boşlukları alt çizgi ile değiştirmek istiyorum.

File 1
File 2
File 3
Dir 1
Dir 3

yeniden adlandırılmalıdır

File_1
File_2
File_3
Dir_1
Dir_3

Yanıtlar:


36

Ayrıca, alt dizinlerdeki dosyaları da yeniden adlandırmanız gerekirse ve siz findde -execdiryüklemeyi destekliyorsanız,

find /search/path -depth -name '* *' \
    -execdir bash -c 'mv -- "$1" "${1// /_}"' bash {} \;

Bana -depthseçenek önerdiği findve beni düşündürttüğü için @glenn jackman'a teşekkür ederim .

Bazı sistemlerde (GNU / Linux olanlar dahil), findadında boşluk ve ayrıca geçerli karakterler oluşturmayan bayt dizileri içeren dosyaları bulamayacağınıza dikkat edin (tipik olarak karakter setinde kodlanmış ASCII olmayan karakterlere sahip olan medya dosyalarında) yerel ayarlardan farklı). Yerel ayarın C(olduğu gibi LC_ALL=C find...) ayarlanması sorunu giderir.


find -maxdepth 1OP'nin mevcut klasörde çalışması hakkında tam olarak ne istediğini yapmak için kullanmanız gerekir .
Caleb

1
Find'ın -depthseçeneğini kullanın ve bundan kurtulabilirsiniz sort.
glenn jackman,

@glenn jackman: teşekkür ederim, şimdi anladım ki çözümüm yanlıştı.
enzotib

2
Değişim -name '* *'için -name '*_*'ve değişim "${1// /_}"için"${1//_/.}"
enzotib

1
@kroiz: "Desen değiştirme" olarak adlandırılır. Onu bashman sayfasında bulabilirsin.
enzotib

34

Herhangi bir kabukta, adı boşluk içeren dosyaların üzerinde dolaşabilirsiniz. Boşlukların alt çizgi ile değiştirilmesi bash, ksh ve zsh ile ${VARIABLE//PATTERN/REPLACEMENT}yapı içerisinde kolaydır .

for x in *" "*; do
  mv -- "$x" "${x// /_}"
done

Debian, Ubuntu ve türevlerinde Perl'i kullanabilirsiniz rename(diğer dağıtımlar farklı bir program gönderir renameve bu program burada yardımcı olmaz).

rename 's/ /_/g' *

Zorunlu bir zsh çözümü:

autoload zmv
zmv '(*)' '${1// /_}'

Zorunlu bir POSIX çözümü:

for x in *" "*; do
  y=$(printf %sa "$x" | tr " " "_")
  mv -- "$x" "${y%a}"
done

"Rename" komutunun sonunda 'g' ne anlama geliyor? Kılavuzda görmedim.
JulianLai

Sadece dizin nasıl yeniden adlandırılır? Dosya adını değiştirmek istemiyorum.
JulianLai

@JulianLai s/…/…/gtüm oluşumları değiştirmek anlamına gelir. Kılavuzda çok iyi açıklanmadı . Dizinleri yeniden adlandırmak istiyorsanız, yolları var, lütfen araştırın (daha önce gördüm sanırım) ve bulamazsanız yeni bir soru sorun.
Gilles 'SO- kötülükten vazgeç'

Büyük ... Bu tüm adlandırmak bana yardımcı _MG_blah.JPGiçin IMG_blah.JPG.
Abinash Dash

13

Bunun için kullanabilirsiniz rename(burada birini util-linuxdeğil birini varsayarsak perl):

cd /path/to/dir
rename ' ' _ *\ *

Bu, addaki tüm dosya ve dizin alanlarını bulur ve boşluğu alt çizgi ile değiştirir. Glob dosyası eşleştirmesi kullandığından, başlamak için doğru dizinde olmanız gerekir.

Özyinelemeli eşleşmeler yapmak istiyorsanız, ancak renamedizinlerinde yeniden adlandırılan öğeleri yakalamak için birkaç kez yürütmeniz gerekebilir :

cd /path/to/dir
shopt -s globstar
rename ' ' _ **/*\ *
!!; !!

2
renameDeğiştirerek belirtilen dosyaları yeniden adlandırır ilk oluşumunu itibaren tarafından kendi adlarına için .” Bu kendi adlarına tek boşluk ile dosyalar için yalnızca işleyecek Yani. ( renameBir döngüde çağırabilirsin , ama burası gerçekten doğru araç değil.)
Gilles 'SO-


1

Debian / Ubuntu'da Caleb ve Gilles'un cevaplarını temel alarak, dosyaları tekrarlı bir şekilde yeniden adlandırmamda işe yarayan şey buydu:

cd /path/to/dir
shopt -s globstar
rename 's/ /_/g' **

Not: Hangi dosyaların yeniden adlandırılacağını ve nasıl önizleneceğini görmek için -nanahtarı kullanın rename:

rename -n 's/ /_/g' **

Başka bir not: ayar globstar, **tüm alt dizinlerdeki eşleşme dosyalarını yapar , bu nedenle yalnızca geçerli dizin isteniyorsa, globstar ayarlamayın veya *bunun yerine kullanmayın **.

Bir not daha: renameArama teriminin birden fazla tekrarı olan dosyalar için komutun bir defadan fazla çalıştırılması gerekir.


Bu, yalnızca dizinler boşluk içermiyorsa çalışır. (bir adlandırma a b/c diçin a_b/c_dçalışma olmaz, yeniden adlandırmak ilk ihtiyacım olacağını a b/c dhiç a b/c_d, ardından a bkarşı a_b).
Stéphane Chazelas

@Stephane: Aynı renamekomutu iki kere çalıştırmak anlamına mı geliyor ?
Markus Pscheidt

Eh, daha çok iç içe geçmiş dizinleri olan boşluklar gibi. İdeal olarak, önce dizin derinliğini geçmek ve yalnızca kabul edilen çözümde olduğu gibi dosyanın taban adını dönüştürmek istiyorsunuz. Ayrıca **bash'ın nokta dosyaları hariç tuttuğunu ve sembolik işaretleri geçtiğini unutmayın .
Stéphane Chazelas

0

Düzenli ifadelerde flaş değilseniz (değilim!) Ve kde için tasarlanmış uygulamaları çalıştırabilirsiniz (ya kde - k masaüstünü kullanırsınız ya da kitaplıkları kurulursa), krename harika bir grafik aracıdır. Değişiklikleri yapmadan önce ve sonra görmenizi sağlar . Seçenek olarak bir dizi basit dönüşüme sahiptir ve ayrıca düzenli ifadeleri de destekler. Birkaç sıralı dönüştürmeyi tek bir adla bile birleştirebilirsiniz, böylece hepsini bir kerede yapan tek bir karmaşık dönüşüm tasarlamak zorunda kalmazsınız. Aynı zamanda, yeniden adlandırma uygulandıktan sonra aynı dosyaları yeniden adlandırmaya devam etme seçeneği de vardır.

Bunu çok sık kullanmıyorum, ancak yaptığım zaman işi gerçekten hızlı ve kolay bir şekilde yapıyor. İndirilen çeşitli medya dosyalarını yeniden adlandırırken gerçekten kullanışlıdır, böylelikle bunları sisteminizde düzenli olarak yönetebilirsiniz. Program adı kullanılırken krename kullanım kılavuzunun ayrıca indirilmesine yardımcı olur.

http://www.krename.net/

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.