Yanıtlar:
Diğerlerinin de söylediği gibi, rename
bu konuda iyidir, ancak man rename
denemeden önce man sayfasını ( ) okuyun . Dışarıda adlandırılan tamamen farklı en az iki araç var rename
ve 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
rename
işlevi olmadığında (örneğin, meşgul kutusu) yardımcı olur
İ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. (-:
ls
çıktıyı ayrıştırmamalı .
sed
Örnek olsa da, oldukça iyi.
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 :)