Mv gibi fakat regex ile bir linux komutu var mı?


Yanıtlar:


32

Diğerlerinin de söylediği gibi, renamebu konuda iyidir, ancak man renamedenemeden önce man sayfasını ( ) okuyun . Dışarıda adlandırılan tamamen farklı en az iki araç var renameve hangisine sahip olduğunuz dağıtımınıza bağlı olacak. Onları yanlış çağırmak tehlikeli olabilir.

İşte Ubuntu ile birlikte gelen Larry Wall'ın perl tabanlı versiyonunun tanıtım sayfası . Buna gibi bir perl ifadesi verirsinizrename 's/\.sql$/.php/' *.sql

İşte eski Red Hat ve CentOS dağıtımlarıyla gelen yeni adın tanıtım sayfası . Kullanımı gibi basit bir dize değiştirmerename .sql .php *.sql

Her dosyayı teker teker işlemek için bir bash one-liner kullanabilirsiniz:

$ for f in *.sql; do mv -i "$f" "${f%%.*}.php"; done

Biri perl tabanlı yeniden adlandırma için bir Windows binary yükleyebilir mi?
Mcandre

Perl sürümünün yeniden adlandırılması, dosyaları bir dosya sisteminden diğerine taşıyamaz.
lilydjwg

bash one-liner, özellikle hiçbir renameişlevi olmadığında (örneğin, meşgul kutusu) yardımcı olur
artm

10

Orada rename(1)Regexes kullanmaz, ama sorununuzu çözebilir, hangi:

rename .sql .php *.sql

Ayrıca var mmv(1), ama nasıl çalıştığını bilmiyorum.


Ubuntu ve Debian'da (diğer dağıtımlardan emin değilsiniz), varsayılan olarak, regexps'i alan /usr/bin/renamebağlantılar /usr/bin/prename.
09’a

5

İyi günler,

Ayrıca girmeyi deneyebilirsiniz

for i in $(\ls -d *.sql)
do
mv $i $(echo $i | sed -e 's/\.sql$/\.php/')
done

Veya regex'in değiştirmesini kullanması için

for i in $(\ls -d | egrep -e '.*\.sql')
do
mv $i $(echo $i | sed -e 's/\.sql$/\.php/')
done

Kabuk biraz kodlama eğlence için. (-:


2
Bu, adlarında boşluk içeren dosyalarda başarısız olur, bu nedenle dikkatli olun. İnsan asla lsçıktıyı ayrıştırmamalı .
slhck

sedÖrnek olsa da, oldukça iyi.
parlak-yıldız

2

Tesisatçı olarak boruları severim :)

Not: Bu cevap ayrıntılıdır - Yeni biri olarak, bilen biri açıklamaya zaman ayırdığında bunu takdir ediyorum, bu yüzden 'ileri' ödeme yapıyorum. Eğer bir yenidoğan değilseniz, lütfen uzunluğu ve ayrıntı vermeyin.

ls -1 *_201[67][0-9]* | sed -e 's/\(\(.\+\)[-_]\(201[67][0-9]\{4\}\)\([^.]\+\)\?\.[0-9a-z]\{2,3\}\)/mkdir -p \2\/\3; mv \1 \2\/\3\/\1/' | bash

Nerede:

ls -1 *_201[67][0-9]*

kalıpla eşleşen tüm dosyaları listeler, bu durumda dosya adı 'YYYYMMDD' formundaki tarihe sahip dosyaları arıyorum

sed -e 's/\(\(.\+\)[-_]\(201[67][0-9]\{4\}\)\([^.]\+\)\?\.[0-9a-z]\{2,3\}\)/mkdir -p \2\/\3; mv \1 \2\/\3\/\1/'
#        : | |    |     |                  | |       |                    |:                                 :
#        : |^2....^    ^3..................^^4.......^                    |:                                 :
#        :^1..............................................................^:                                 :
#        /................filename.................pattern................./...mkdir...and....mv...command.../

^ 1: 1. yakalama grubu - tüm dosya adı

^ 2: 2. yakalama grubu - dosya adı deseninin 1. kısmı

^ 3: 3. yakalama grubu - 2. dosya adı bölümü - burada, 'YYYYMMDD' olarak tarih

^ 4: 4. yakalama grubu - tarih ile uzantı arasında isteğe bağlı dosya adı bölümü ve uzantının kendisi

Sooooo .... eğer bir dosyam varsa

CallLog_555123412_20161231-214403.7z

...sonra

mkdir -p \2\/\3; mv \1 \2\/\3\/\1

aslında demek

# make directory and sub-directory
mkdir -p CallLog_555123412/20161231
# move file from current directory to sub-sub-directory just created
mv CallLog_555123412_20161231-214403.7z CallLog_555123412/20161231/CallLog_555123412_20161231-214403.7z

Sed komutunun çıktısının çalıştırılması için 'bash' ile yayınlandığını unutmayın. Önerilen dosyayı ilk olarak görmek için, onları HAREKETLENMEDEN taşıyorsanız, önce '| sonunda bash ve böyle deneyin:

ls -1 *_201[67][0-9]* | sed -e 's/\(\(.\+\)[-_]\(201[67][0-9]\{4\}\)\([^.]\+\)\?\.[0-9a-z]\{2,3\}\)/mkdir -p \2\/\3; mv \1 \2\/\3\/\1/'

Bu hiçbir değişiklik yapmaz, ancak çalıştırırsanız çalıştırılacak komutu göreceksiniz '| sonunda etiketlenen bash.

Bu yararlıdır çünkü dosya adındaki bölümlerden istediğiniz alt dizinleri veya sed komutundaki 'değiştirme' metnine eklediğiniz herhangi bir şeyi oluşturabilirsiniz. Ancak sed'in birçok kaçış karakteri gerektirdiğini unutmayın.

SED Regex destekleri:

(...) yakalama gruplaması için kaçmayı gerektirir -> \ (... \)

{m, n} önceki nesneyi ölçmek için kaçmayı gerektirir -> \ {m, n \}

/ değiştirilen dizgede kaçmayı gerektirir -> \ /

[...] Karakter sınıfları için kaçmayı GEREKMEZ

Değiştirme dizesindeki \ 1, ilk yakalanan gruba atıfta bulunur, vb.

GÜVENLİK UYARISI: ASLA HİÇBİR ÇIKTIĞINI SİZMEK İÇİN HİÇBİR ŞEYE HAZIRLANIN ...

Bazı tıkanıklıkları gidermeye yardımcı olan umarım :)


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.