Linux'ta tüm klasörleri ve dosyaları küçük harfle nasıl yeniden adlandırabilirim?


179

Ben hiçbir yerde büyük harf görünmüyor (bu C ++ kaynak kodu, ancak bu önemli değil) böylece tam bir klasör ağacı özyinelemeli olarak yeniden adlandırmak zorunda.

CVS ve Subversion sürüm kontrol dosyaları / klasörlerini yok saymak için bonus puanlar. Herhangi bir Linux kutusunda bir kabuk bulunması gerektiğinden, tercih edilen yol bir kabuk betiği olacaktır.

Dosya yeniden adlandırma ayrıntıları hakkında bazı geçerli argümanlar vardı.

  1. Aynı küçük harfli dosyaların üzerine yazılması gerektiğini düşünüyorum; kullanıcının sorunu. Büyük / küçük harfleri göz ardı eden bir dosya sistemine bakıldığında, ilkinin ikisini de geçersiz kılar.

  2. Ben AZ karakter düşünün ve onları az dönüştürmek, her şey sadece (en azından kaynak kodu ile) sorunlar için arıyor.

  3. Komut dosyası bir Linux sistemi üzerinde bir yapı çalıştırmak için gerekli olacaktır, bu yüzden bence CVS veya Subversion sürüm kontrol dosyalarındaki değişiklikler atlanmalıdır. Sonuçta, bu sadece bir çizik ödeme. Belki bir "ihracat" daha uygundur.


Önceden gönderilenler kutudan mükemmel bir şekilde veya basit durumlar için birkaç ayarlamayla çalışacaktır, ancak toplu yeniden adlandırmayı çalıştırmadan önce dikkate almak isteyebileceğiniz bazı durumlar vardır: 1. adresinde iki veya daha fazla adınız varsa ne olmalıdır? yol hiyerarşisinde yalnızca ve duruma göre farklılık gösteren aynı düzey ABCdef, abcDEFve aBcDeF? Yeniden adlandırma komut dosyası iptal edilmeli mi yoksa sadece uyarılıp devam etmeli mi? 2. US-ASCII dışı isimler için küçük harfleri nasıl tanımlarsınız? Bu adlar mevcutsa, önce bir kontrol ve hariç tutma geçişi yapılmalıdır? 3. Bir yeniden adlandırma işlemi gerçekleştiriyorsanız
Mihai Limbășan

Yanıtlar:


179

"rename"Komutu kullanarak kısa bir sürüm :

find my_root_dir -depth -exec rename 's/(.*)\/([^\/]*)/$1\/\L$2/' {} \;

Bu, dizinlerin dosyalardan önce yeniden adlandırılması ve dosyaların mevcut olmayan dizinlere (ör. "A/A"İçine "a/a") taşınmaya çalışılmasıyla ilgili sorunları önler .

Veya kullanmadan daha ayrıntılı bir sürüm "rename".

for SRC in `find my_root_dir -depth`
do
    DST=`dirname "${SRC}"`/`basename "${SRC}" | tr '[A-Z]' '[a-z]'`
    if [ "${SRC}" != "${DST}" ]
    then
        [ ! -e "${DST}" ] && mv -T "${SRC}" "${DST}" || echo "${SRC} was not renamed"
    fi
done

PS

İkincisi, move komutuyla daha fazla esnekliğe izin verir (örneğin, "svn mv").


36
yeniden adlandırma kullanarak bu şekilde de yapılabilir 'y / AZ / az /' *
Tzury Bar Yochay

3
Her iki sürümün de büyük / küçük harfe duyarlı olmayan bir dosya sisteminde çalışmadığını unutmayın. Benim durumumda - thenkapalı satırı değiştirdim (mv "${SRC}" "${DST}.renametmp" && mv "${DST}.renametmp" "${DST}") || echo "${SRC} was not renamed".
Lloeki

6
İkinci yaklaşım boş alanlar içeren dosyalarda benim için doğru çalışmadı (context: linux, bash).
dim

4
Yeniden adlandırma işleminin son sürümünü kullandığınızda normal ifade gerekmez. Tam komut olur find my_root_dir -depth -exec rename -c {} \;. Büyük / küçük harfe duyarlı olmayan bir dosya sistemindeyseniz yeniden adlandırmak için -f ekleyin (örn. Mac)
Javache

İkincisi -T, mvkomuttan kaldırarak benim için Solaris'te çalıştı .
Ham

261

Küçük hala oldukça seviyorum:

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

OS X'in HFS + gibi hassas olmayan dosya sistemlerinde -fbayrağı eklemek istersiniz :

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

3
linux.icydog.net/rename.php :The renaming utility that comes by default with Ubuntu is a Perl program sometimes called prename
sleepsort

1
Teşekkürler, bu şekilde kullandım $ find | xargs 'y / AZ / az /' * adını değiştirdi
Rashi

5
Bu, perls yeniden adlandırma yaptığınızı varsayar, bu her zaman böyle değildir. örneğin benim debian
ismim

10
Arch üzerinde program çağrılır perl-rename(ve aynı adı taşıyan bir paket tarafından sağlanır)
jaymmer - Reinstate Monica

3
"Yeniden adlandırma" özyinelemeli olmadığından, bu sorun yanıtlanmaz.
Cybolic

89
for f in `find`; do mv -v "$f" "`echo $f | tr '[A-Z]' '[a-z]'`"; done

Lütfen komut dosyanızı çalıştırmadan önce bir "mkdir -p A / B / C" yapın.
tzot

2
"find" yerine, yeniden adlandırmak istediğiniz dosyaların bir listesini almak için kullandığınız komut kullanılmalıdır; örneğin, "ls *. {C, CPP, H}".
JPaget

2
OS X üzerinde çalışmaz, sadece kullanım bilgilerini yazdırır find. find .bunu düzeltmek gibi görünüyor.
emlai

3
Tüm yorumlar "konsolide" versiyonu (cevap artık düzenlenemez):for f in `find .`; do mv -v "$f" "`echo $f | tr '[A-Z]' '[a-z]'`"; done
romaricdrigon

1
Birisi bunun neden ilk başta çalışması gerektiğini açıklayabilir mi? ./FOO ve ./FOO/BAR bulursa, önce ./FOO adını ./foo olarak değiştirir, bundan sonra artık ./FOO/BAR öğesini bulamaz. Kendi cevabımı aşağıya girerek bunu düzeltmeliyim.
oisyn

80

Verimliliği önemsemeniz gerekmiyorsa aşağıdakileri deneyin.

zip -r foo.zip foo/*
unzip -LL foo.zip

13
Vay canına, bu oldukça verimsiz bir yol.
Artjom B.

28
Hesaplama verimliliğinin genellikle bir dizindeki dosyaları yeniden adlandırmanız gerektiğinde endişe duymadığınızı varsayarak ... Bu muhtemelen bu iş parçacığındaki en yaratıcı basit çözüm olduğunu düşünüyorum. Gerçekten bu önemsiz şey, kabul edilen cevapların gösterdiği kadar karmaşık olmamalı ve bu geçici çözüm, böyle bir operasyona yatırım yapmak istediğim düşünce miktarı ile çok daha orantılı. +1000
Peter M. Elias

27
-0('Sıfır', sıkıştırma yok) anahtarı ile hızlandırabilirsiniz ,zip -0 -r foo.zip foo/ .
Johnny Baloney

3
Farklı dizin yapılarında 50.000'den fazla dosya adını değiştirmek zorunda kaldım. Kabul edilen orijinal cevap, 2 dakika içinde işin neredeyse% 10'unu yaptı, burada -0sıkıştırma ile neredeyse anında oldu!
Peon

2
Bu sadece verimsiz değil. Bu seferki basitçe imkansız geçici arşiv için yeterli boş alan yoksa.
Victor Yarema

20

Dostum, siz / kızlar işleri karmaşıklaştırmayı seviyorsunuz ...

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

2
Bu işe yaramaz, küçük harfli bir dosyanın zaten mevcut olduğunu söyler.
kirhgoff

talimatları takip - @kirhgoff Ben NFS atlarla gerçekleştiğini gördük burada .
joebeeson

Büyük / küçük harfe duyarlı bir dosya sisteminde nasıl yeniden adlandırabiliriz? rename 'y/a-z/A-Z/' /tmp/*.jpg-> Can't rename /tmp/*.jpg /TMP/*.JPG: No such file or directory, yani, sadece dosya yerine tüm yolu yeniden adlandırmayı deneyin.
Pablo A

14

Yukarıdaki cevapların çoğu tehlikelidir, çünkü garip karakterler içeren isimlerle ilgilenmezler. Bu tür şeyler için en güvenli bahsiniz kullanmakfind 'ın -print0yerine ASCII NUL ile dosya sona erer \ n seçeneğini.

Karıştırmamak için dizin adlarını değil, yalnızca dosyaları değiştiren bir komut dosyası find:

find .  -type f -print0 | xargs -0n 1 bash -c \
's=$(dirname "$0")/$(basename "$0");
d=$(dirname "$0")/$(basename "$0"|tr "[A-Z]" "[a-z]"); mv -f "$s" "$d"'

Bunu test ettim ve boşluklar, her türlü tırnak, vb. İçeren dosya adları ile çalışır.

touch \;\ echo\ hacker::0:0:hacker:\$\'\057\'root:\$\'\057\'bin\$\'\057\'bash

... Öyleyse tahmin et ...


Bunun renameyerine kullanımı daha basit olurdu mv.
Victor Yarema

14

Bu, rename komutuna zaten sahipseniz veya ayarladıysanız çalışır (örneğin , Mac'te demlemek yoluyla ):

rename --lower-case --force somedir/*

9
... önce yeniden adlandırma ayarladıysanız, örneğinbrew install rename
pduersteler

3
'y / AZ / az /' * adını değiştir
Stephen

4
--lower-case? Ne yazık ki Arch Linux'ta durum böyle değil.

3
renamebir bash yerleşimi değildir. Harici bir yardımcı programdır ve sözdizimi, yüklediğiniz sürüme bağlı olarak değişir. Bu yanıt, iddia edildiği gibi "tüm unix tabanlı işletim sistemleri için" taşınabilir bir çözüm olarak yeterli değildir.
Corey Goldberg

2
Az önce kontrol renameedildiğinde, en son Fedora'ya (28) util-linux-2.31paket yoluyla dahil edilen komutun --lower-caseseçeneği yoktur.
niXar


6

Mac OS X'te bulduğum en basit yaklaşım, http://plasmasturm.org/code/rename/ adresinden yeniden adlandırma paketini kullanmaktı :

brew install rename
rename --force --lower-case --nows *

--force Hedef adına sahip bir dosya zaten mevcut olsa bile yeniden adlandırın.

--lower-case Dosya adlarını küçük harfe dönüştürün.

--nows Dosya adındaki tüm boşluk alanlarını tek alt çizgi karakterleriyle değiştir.


5

İşte bir Bash kabuk betiği kullanarak benim en düşük çözüm:

#!/bin/bash
# First, rename all folders
for f in `find . -depth ! -name CVS -type d`; do
   g=`dirname "$f"`/`basename "$f" | tr '[A-Z]' '[a-z]'`
   if [ "xxx$f" != "xxx$g" ]; then
      echo "Renaming folder $f"
      mv -f "$f" "$g"
   fi
done

# Now, rename all files
for f in `find . ! -type d`; do
   g=`dirname "$f"`/`basename "$f" | tr '[A-Z]' '[a-z]'`
   if [ "xxx$f" != "xxx$g" ]; then
      echo "Renaming file $f"
      mv -f "$f" "$g"
   fi
done

Klasörlerin tümü doğru şekilde yeniden adlandırılmış ve mv izinler eşleşmediğinde soru sormaz ve CVS klasörleri yeniden adlandırılmaz (maalesef bu klasör içindeki CVS kontrol dosyaları yine de yeniden adlandırılır).

"Find -depth" ve "find | sort -r" her ikisi de klasör listesini yeniden adlandırmak için kullanılabilir bir sırayla döndürdüğünden, klasör aramak için "-depth" kullanmayı tercih ettim.


İlk bulmanız işe yaramıyor. "Mkdir -p A / B / C" yazıp komut dosyanızı çalıştırmayı deneyin.
tzot

4

Orijinal soru, find komutuna -prune eklenerek yapılabilen SVN ve CVS dizinlerini yok saymayı istedi. CVS'yi yoksaymak için:

find . -name CVS -prune -o -exec mv '{}' `echo {} | tr '[A-Z]' '[a-z]'` \; -print

Bunu denedim ve küçük harfli çeviriyi bulgunun içine yerleştirmek aslında anlamadığım nedenlerle işe yaramadı. Yani, bunu şu şekilde değiştirin:

$> cat > tolower
#!/bin/bash
mv $1 `echo $1 | tr '[:upper:]' '[:lower:]'`
^D
$> chmod u+x tolower 
$> find . -name CVS -prune -o -exec tolower '{}'  \;

Ian


4

Larry Wall'ın dosya adı sabitleyicisini kullanarak:

$op = shift or die $help;
chomp(@ARGV = <STDIN>) unless @ARGV;
for (@ARGV) {
    $was = $_;
    eval $op;
    die $@ if $@;
    rename($was,$_) unless $was eq $_;
}

Kadar basit

find | fix 'tr/A-Z/a-z/'

( fixtabii ki yukarıdaki senaryo nerede )


3

Bu, istediğinizi yapan küçük bir kabuk betiğidir:

root_directory="${1?-please specify parent directory}"
do_it () {
    awk '{ lc= tolower($0); if (lc != $0) print "mv \""  $0 "\" \"" lc "\"" }' | sh
}
# first the folders
find "$root_directory" -depth -type d | do_it
find "$root_directory" ! -type d | do_it

İlk bulmada -depth eylemine dikkat edin.


1
Tüm iş parçacığından bir Mac üzerinde çalışan tek şey. Teşekkürler yığınları!
YemSalat

2

Taşınabilir değil, sadece Zsh, ama oldukça özlü.

İlk olarak, zmvyüklendiğinden emin olun .

autoload -U zmv

Ayrıca, şunların açık olduğundan emin olun extendedglob:

setopt extendedglob

Sonra kullan:

zmv '(**/)(*)~CVS~**/CVS' '${1}${(L)2}'

Adın CVS olmadığı dosyaları ve dizinleri yinelemeli olarak küçük harfle yazmak için .


2
for f in `find -depth`; do mv ${f} ${f,,} ; done

find -depthher dosya ve dizini yazdırır, dizinin kendisinden önce dizinin içeriği yazdırılır. ${f,,}dosya adını küçük harfe çevirir.


Bu işe yaramaz: bir dizini içerik üzerinde çalışmadan önce yeniden adlandırır, böylece içerik üzerinde daha sonraki deneme başarısız olur.
Erik

-depthDüzeltmeler ekleyerek ! Bu gerçekten hızlı bir çözüm, ama tabii ki -print0bulma seçeneğini kullanmadan , en güvenilir değil
jpaugh

@jpaugh Hayır değil. ./FOO/BAR öğesini ./foo/bar olarak yeniden adlandırmaya çalışacak, ancak ./foo henüz mevcut değil.
oisyn

2

MacOS ile,

renamePaketi kurun ,

brew install rename

Kullanım,

find . -iname "*.py" -type f | xargs -I% rename -c -f  "%"                       

Bu komut, *.pyuzantıya sahip tüm dosyaları bulur ve dosya adlarını küçük harfe dönüştürür.

`f` - forces a rename

Örneğin,

$ find . -iname "*.py" -type f
./sample/Sample_File.py
./sample_file.py
$ find . -iname "*.py" -type f | xargs -I% rename -c -f  "%"
$ find . -iname "*.py" -type f
./sample/sample_file.py
./sample_file.py

Neden kullandınız -Iseçeneği xargsburada?
Victor Yarema

- IBayrak zorunlu değildir. İle birden fazla komut yürüttüğümüzde kullanılır xargs. İşte gibi xargs cat foo.txt | xargs -I % sh -c 'echo %; mkdir %' olmadan birden fazla komut kullanma örneği-Ifind . -iname "*.py" -type f | xargs -I% rename -c -f "%"
akilesh raj

2

Yazı tipini kullanın :

typeset -l new        # Always lowercase
find $topPoint |      # Not using xargs to make this more readable
  while read old
  do new="$old"       # $new is a lowercase version of $old
     mv "$old" "$new" # Quotes for those annoying embedded spaces
  done

Windows'da Git Bash gibi emülasyonlar başarısız olabilir, çünkü Windows başlık altında büyük / küçük harfe duyarlı değildir. Bunlar için, mvönce "$ old.tmp" gibi başka bir isme dosya olan bir adımı ve sonra da olanı ekleyin $new.


1

Uzun Ama "Sürpriz ve Çalışıyor"

Bu komut dosyası boşlukları, tırnak işaretleri, diğer olağandışı karakterler ve Unicode ile dosya adlarını işler, büyük / küçük harf duyarsız dosya sistemleri ve bash ve awk yüklü çoğu Unix-y ortamında çalışır (yani neredeyse hepsi). Ayrıca, varsa (dosya adını büyük harfle bırakarak) çarpışmaları raporlar ve elbette hem dosyaları hem de dizinleri yeniden adlandırır ve özyinelemeli olarak çalışır. Son olarak son derece uyarlanabilir: İstediğiniz dosyaları / dizinleri hedeflemek için find komutunu değiştirebilir ve diğer ad manipülasyonları yapmak için awk'yi değiştirebilirsiniz. "Unicode" kolları ile gerçekten kendi durumlarını dönüştürmek anlamına gelir (onları kullanan cevaplar gibi görmezden değil tr).

# adapt the following command _IF_ you want to deal with specific files/dirs
find . -depth -mindepth 1 -exec bash -c '
  for file do
    # adapt the awk command if you wish to rename to something other than lowercase
    newname=$(dirname "$file")/$(basename "$file" | awk "{print tolower(\$0)}")
    if [ "$file" != "$newname" ] ; then
        # the extra step with the temp filename is for case-insensitive filesystems
        if [ ! -e "$newname" ] && [ ! -e "$newname.lcrnm.tmp" ] ; then
           mv -T "$file" "$newname.lcrnm.tmp" && mv -T "$newname.lcrnm.tmp" "$newname" 
        else
           echo "ERROR: Name already exists: $newname"
        fi
    fi    
  done
' sh {} +

Referanslar

Senaryom şu mükemmel cevaplara dayanmaktadır:

/unix/9496/looping-through-files-with-spaces-in-the-names

Bir dizeyi Bash'te küçük harfe nasıl dönüştürebilirim?


1

Bu macOS üzerinde de iyi çalışır:

ruby -e "Dir['*'].each { |p| File.rename(p, p.downcase) }"

Bu özellikle güzel, çünkü Ruby macOS ile birlikte geliyor.
jxmorris12

1

Bunu Windows 7'deki bir Cygwin kurulumunda yapmam gerekiyordu ve denediğim önerilerle sözdizimi hataları aldığımı buldum (ancak bir çalışma seçeneğini kaçırmış olabilirim). Ancak, doğrudan Ubuntu forumlarından gelen bu çözüm kutudan çalıştı :-)

ls | while read upName; do loName=`echo "${upName}" | tr '[:upper:]' '[:lower:]'`; mv "$upName" "$loName"; done

(Not: Daha önce boşluk kullanarak alt çizgiler ile değiştirmişti:

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

)


1

OS X, mv -f"aynı dosya" hatası gösterir, bu yüzden iki kez yeniden adlandırmak:

for i in `find . -name "*" -type f |grep -e "[A-Z]"`; do j=`echo $i | tr '[A-Z]' '[a-z]' | sed s/\-1$//`; mv $i $i-1; mv $i-1 $j; done

1

Bu durumda boşluk veya eğik çizgi olmadan iyimser yollardan kaçınmak için Python'a ulaşacağım. Ayrıca python2daha fazla yere kurulma eğiliminde olduğunu gördüm rename.

#!/usr/bin/env python2
import sys, os

def rename_dir(directory):
  print('DEBUG: rename('+directory+')')

  # Rename current directory if needed
  os.rename(directory, directory.lower())
  directory = directory.lower()

  # Rename children
  for fn in os.listdir(directory):
    path = os.path.join(directory, fn)
    os.rename(path, path.lower())
    path = path.lower()

    # Rename children within, if this child is a directory
    if os.path.isdir(path):
        rename_dir(path)

# Run program, using the first argument passed to this Python script as the name of the folder
rename_dir(sys.argv[1])

Karmaşık hale getirme hakkında konuşun ... sadece yapın .. 'y / AZ / az /' * olarak yeniden adlandırın
Stephen

1
@Stephen, yeniden adlandırmayı yüklemek için yönetici erişimine sahip olduğunuzu varsayar. Sık sık başka yazılım yükleyemediğim sistemlere veri sıkıştırmam gerekiyor. Son Ubuntus'ta, bu sadece perl varsa kurulur.
John Foley

1

Arch Linux kullanıyorsanız , komut dosyasını çalıştırılabilir ve manuel sayfa olarak sağlayan renamepaketten yükleyebilirsiniz.AURrenamexm/usr/bin/renamexm onunla birlikte.

Dosyaları ve dizinleri hızlı bir şekilde yeniden adlandırmak için gerçekten güçlü bir araçtır.

Küçük harfe dönüştür

rename -l Developers.mp3 # or --lowcase

UPPER kılıfına dönüştür

rename -u developers.mp3 # or --upcase, long option

Diğer seçenekler

-R --recursive # directory and its children

-t --test # Dry run, output but don't rename

-o --owner # Change file owner as well to user specified

-v --verbose # Output what file is renamed and its new name

-s/str/str2 # Substitute string on pattern

--yes # Confirm all actions

Gerekirse örnek Developers.mp3 dosyasını buradan alabilirsiniz ;)


1
brewmacOS'ta yeniden adlandır, -lbir sembolik bağlantı oluşturmaya ve -cküçük harfe dönüştürmeye bağlanmıştır , bu yüzden dikkat edin.
rien333

0
( find YOURDIR -type d | sort -r;
  find yourdir -type f ) |
grep -v /CVS | grep -v /SVN |
while read f; do mv -v $f `echo $f | tr '[A-Z]' '[a-z]'`; done

Önce dizinleri aşağıdan yukarıya sıralama -r (burada -depth kullanılabilir değil), sonra dosyaları yeniden adlandırın . Sonra grep -v / CVS yerine find ...- budandır çünkü daha basittir. Büyük dizinler için, f için ... bazı kabuk tamponlarını taşabilir. Bul özelliğini kullanın ... | önlemek için okuyun .

Ve evet, bu sadece durumda farklılık gösteren dosyaları tıkayacak ...


Birincisi: find YOURDIR -type d | sort -rçok fazla sorun var. Sen istiyorsun find YOURDIR -depth -type d. İkinci olarak, find -type fDİZİN dizinler yeniden adlandırıldıktan sonra çalıştırın.
tzot

0
find . -depth -name '*[A-Z]*'|sed -n 's/\(.*\/\)\(.*\)/mv -n -v -T \1\2 \1\L\2/p'|sh

Burada belirtilen daha ayrıntılı komut dosyalarını denemedim, ancak tek komut satırı sürümlerinin hiçbiri Synology NAS'ımda benim için çalışmadı. renameMevcut ve varyasyonları birçok değildir findo bulabilmesi halinde, örneğin zaten değiştirildi yolunun (eski adıyla sopa gibi görünüyor, çünkü başarısız ./FOOardından ./FOO/BARyeniden adlandırma, ./FOOiçin ./foohala listeye devam edecektir./FOO/BAR bu yol artık geçerli olmasa bile ) . Yukarıdaki komut benim için herhangi bir sorun olmadan çalıştı.

Aşağıda komutun her bir parçasının açıklaması yer almaktadır:


find . -depth -name '*[A-Z]*'

Bu, geçerli dizindeki herhangi bir dosyayı bulur (değiştir . işlemek istediğiniz dizine ), önce derinlik aramasını kullanarak (örn., Daha ./foo/barönce listeleyecektir ./foo), ancak yalnızca büyük harf karakter içeren dosyalar için bulur. -nameFiltre yalnızca ana dosya ismi değil, tam yol için de geçerlidir. Yani bu listeleyecek ./FOO/BARama olmayacak ./FOO/bar. Yeniden adlandırmak istemediğimiz için bu sorun değil ./FOO/bar. Yine de yeniden adlandırmak istiyoruz ./FOO, ancak daha sonra listeleniyor (bu yüzden -depthönemlidir).

Bu komando başlı başına özellikle yeniden adlandırmak istediğiniz dosyaları bulmak için kullanışlıdır. Dosya adı çakışmaları veya hataları nedeniyle hala değiştirilmemiş dosyaları aramak için, tüm yeniden adlandırma komutundan sonra bunu kullanın.


sed -n 's/\(.*\/\)\(.*\)/mv -n -v -T \1\2 \1\L\2/p'

Bu bölüm, çıktısını alan dosyaları okur findve bunları mvnormal bir ifade kullanarak bir komutta biçimlendirir . -nSeçenek durdurur sedgirişi yazdırmasını ve parama ve değiştirme regex çıkışlar yerini metin komut.

Normal ifadenin kendisi iki yakalamadan oluşur: sonuncuya kadar olan kısım / (dosyanın dizini) ve dosya adının kendisi. Dizin bozulmadan bırakılır, ancak dosya adı küçük harfe dönüştürülür. Yani, findçıktılar olursa ./FOO/BAR, olacak mv -n -v -T ./FOO/BAR ./FOO/bar. Yapma -nseçeneği, mvvarolan küçük harfli dosyaların üzerine yazılmamasını sağlar. -vopsiyon markalarımv her değişikliği çıktı yapar (veya ./FOO/barzaten yapmadıysa ./FOO/BAR -> ./FOO/BAR, herhangi bir değişiklik yapılmadığına dikkat ederek). -TBurada çok önemli - bir dizin olarak hedef dosya davranır. Bu, eğer bu dizin mevcutsa ./FOO/BARtaşınmaz ./FOO/bar.

İle birlikte kullanın find komutların bir listesini oluşturmak için (gerçekten yapmadan ne yapılacağını doğrulamak için kullanışlı)


sh

Bu oldukça açıklayıcı. Oluşturulan tüm mvkomutları kabuk yorumlayıcısına yönlendirir. Bunu, bashveya istediğiniz herhangi bir kabukla değiştirebilirsiniz .


0

Slugify Yeniden Adlandır (normal ifade)

Tam olarak OP'nin istediği şey değil, ama bu sayfada bulmayı umduğum şey:

Dosyaları URL'lere benzer olacak şekilde yeniden adlandırmak için "slugify" sürümü (ör. Yalnızca alfasayısal, noktalar ve kısa çizgiler dahil):

rename "s/[^a-zA-Z0-9\.]+/-/g" filename

2
"tam olarak değil"? Bu OP'nin istediği şey değil
Corey Goldberg
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.