Linux - Dosya adlarındaki boşlukları değiştirme


Yanıtlar:


176

Bunu yapmalı:

for file in *; do mv "$file" `echo $file | tr ' ' '_'` ; done

Bu benim için işe yaramadı. Aynı dosyaların var olduğunu iddia etti (yanlış dosya adlarıyla). Örneğin, yeniden adlandırmaya çalışmak 1 - foo.jpgve klasörüm zaten içinde vardı 1.jpg.
byxor

3
Tırnak işaretlerinin yakınındayken geri işaretlerini okumayı biraz zor buluyorum. for file in *; do mv "$file" $(echo $file | tr ' ' '_') ; done
Aynısı

Not: Bu, dosyalarının adlarını güncellemek istediğiniz dizinden WITHIN çalıştırılır. Alternatif olarak, değiştirebilir *için PATH_TO_YOUR_DIRECTORY.
CFitz

74

Perl tarzı normal ifadeleri alan 'yeniden adlandır' komutunu kullanmayı tercih ederim:

rename "s/ /_/g" *

-N bayrağıyla prova yapabilirsiniz:

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

3
Bu çalışacaktır eğer sen perl tarzı yeniden adlandırma ve daha basit redhat / fötr birine sahip
David Dean

9
fedora versiyonurename " " "_" *
David Dean

4
renameOSX'te mevcut değil görünür.
Etienne Low-Décarie

MacOS 10.12.3'te renamemevcuttur.
Sung Cho

1
@DavidDean Arch Linux'ta yeniden adlandırma yalnızca ilk geçtiği yerin yerini alacaktır (birden fazla boşluk içeren dosyalar / dizinler için pek uygun değildir). Fedora olanla aynı sözdizimine sahip, bu yüzden aynı sözdiziminden şüpheleniyorum. Ancak perl-rename kurulabilir.
prosoitos

15

Sh kullanın ...

for i in *' '*; do   mv "$i" `echo $i | sed -e 's/ /_/g'`; done

Eğer tetiği çekmeden önce bu out denemek isterseniz sadece değiştirmek mviçin echo mv.


4

Bash kullanıyorsanız:

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

denediğimde, mv aldım: birden çok dosyayı taşırken, son bağımsız değişken bir dizin olmalı mv --help' for more information. mv: when moving multiple files, last argument must be a directory Try Daha fazla bilgi için mv --help'i deneyin .
Mithun Sreedharan

Yine hata mv: eksik dosya argümanı Daha mv --help' for more information. mv: missing file argument Try fazla bilgi için mv --help'i deneyin . mv: eksik dosya bağımsız değişkeni Daha mv --help' for more information. mv: missing file argument Try fazla bilgi için mv --help'i deneyin .
Mithun Sreedharan

@ levislevis85: Thx, bunu bilmiyordum.
soulmerge

4

Ya değiştirme görevini uygulamak isterseniz yinelemeli ? Bunu nasıl yaptın?

Cevabı az önce kendim buldum. En zarif çözüm değil (koşula uymayan dosyaları da yeniden adlandırmaya çalışıyor) ama işe yarıyor. (BTW, benim durumumda dosyaları alt çizgiyle değil '% 20' ile yeniden adlandırmam gerekiyordu)

#!/bin/bash
find . -type d | while read N
do
     (
           cd "$N"
           if test "$?" = "0"
           then
               for file in *; do mv "$file" ${file// /%20}; done
           fi
     )
done

3

İşte başka bir çözüm:

ls | awk '{printf("\"%s\"\n", $0)}' | sed 'p; s/\ /_/g' | xargs -n2 mv
  1. dosyanın adını tırnak içine almak için awk kullanır
  2. alanı alt çizgilerle değiştirmek için sed kullanır; orijinal adı tırnak işaretleriyle yazdırır (awk'dan); sonra değiştirilen isim
  3. xargs bir seferde 2 satır alır ve bunu mv'ye geçirir

2

Tüm dosyalarınızın .txt olduğunu varsayarak şuna benzer bir şey deneyin:

for files in *.txt; do mv “$files” `echo $files | tr ‘ ‘ ‘_’`; done

2
aşağıdaki hatayı aldık tr: mv'yi çevirirken iki dizge verilmelidir: eksik dosya argümanı Daha fazla bilgi için `mv --help'i deneyin.
Mithun Sreedharan

2
Agin hatası tr: çok fazla argüman Daha tr --help' for more information. mv: missing file argument Try fazla bilgi için mv --help'i deneyin .
Mithun Sreedharan

1

Değişkenlerinizi alıntılayın:

for file in *; do echo mv "'$file'" "${file// /_}"; done

Gerçek yeniden adlandırmayı yapmak için "yankı" yı kaldırın.


Bu, mv komutlarını düzgün bir şekilde tekrarlıyor, ancak dosyayı gerçekten yeniden adlandırmıyor!
Mithun Sreedharan

\'1130 lake micigan view.jpg\'': No such file or directory mv: cannot stat echo'nun kaldırılması mv gibi hatalar üretir: \ '1130_1_bedroom_floor_plan.jpg \' ': Böyle bir dosya veya dizin yok mv: \'1130_BedPicture_8.jpg\'': No such file or directory mv: cannot stat \' 1130_diningroom_table.jpg \ '': Böyle bir dosya veya dizin yok
Mithun Sreedharan

Linux Linux 2.6.9-42.0.3.EL.wh1smp # 1 SMP Cuma Ağustos 14 15:48:17 MDT 2009 i686 i686 i386 GNU / Linux
Mithun Sreedharan

1

Bir dizeyi (sizin durumunuzda boşluk karakteri) başka bir dizeyle değiştirmenin en kolay yolu Linuxkullanmaktır sed. Aşağıdaki gibi yapabilirsiniz

sed -i 's/\s/_/g' *

Bu yardımcı olur umarım.


Bu soruyu ele almıyor.
amit


0

Bir .pyuzantı ile tüm dosyaları yeniden adlandırmak için, find . -iname "*.py" -type f | xargs -I% rename "s/ /_/g" "%"

Örnek çıktı,

$ find . -iname "*.py" -type f                                                     
./Sample File.py
./Sample/Sample File.py
$ find . -iname "*.py" -type f | xargs -I% rename "s/ /_/g" "%"
$ find . -iname "*.py" -type f                                                     
./Sample/Sample_File.py
./Sample_File.py
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.