Linux'ta dosyaları normal ifadeyle yeniden adlandırma


10

Sürekli olarak yeniden adlandırmak istediğim bir grup dosyam vardı, dosyalar gibi şeyler

"System-Log-01-01-2009-NODATA.txt"
"Something-Log-01-01-2009-NODATA.txt"

Ve onları küçük harf, yyyymmdd, .log uzantısı olarak istedim

"system.20090101.log"
"something.20090101.log"

Yanıtlar:


14

Yeniden adlandırma komutunu bulana kadar perl betikleri yazardım.

Yeniden adlandırma yapmak için bir perl regex'i kabul eder:

bunun için sadece iki komut yazdım:

rename 's/(\w+)-(\w+)-(\d\d)-(\d{4})-NODATA.txt\$1.$4$3$2.log$//' *
rename 'y/A-Z/a-z/' *.log

Yine de bazı dağıtımlar renameiçin bu işleve sahip değildir (kılavuz sayfasına bakın) perl-renameveya veya yüklemeniz gerekebilir prename.


çok güzel cevap
Judioo

8
Dikkat, bazı dağıtımlar değersiz bir yeniden adlandırma komutu gönderir. Dağıtımınızın ilk hangisine sahip olduğunu kontrol edin.
derobert

Biliyordum mmvama sonunda teşekkürler renameregex gücünü kullanabiliyorum
Ludovic Kuty

5
Arch Linux'ta bu perl-rename.
Oleh Prypin

6

Bir yeniden adlandırma komutu olmadığından, buna güveniyorum:

for myfile in /my/folder/*; do
    target=$(echo $myfile|sed -e 's/foo/bar/g')
    mv "$myfile" "$target"
done

6

mmv , birden fazla dosyayı taşımak / yeniden adlandırmak için standart bir linux yardımcı programıdır. Çoğu dağıtım için depolardan edinilebilir. Yukarıdaki örneğiniz için şunları yapabilirsiniz:

mmv '*-Log-*-*-*-NODATA.txt' '#l1.#4#3#2.log'

Daha fazla bilgi için bu debaday makalesini veya kılavuz sayfasını okuyun .


Bu harika. Teşekkürler. Tek tırnak eklemek zorunda kaldım, aksi takdirde mmv yara hiçbir şey yapmaz.
Gabriel A. Zorrilla

5

renameutil çok "standart" değildir. Her dağıtım farklı bir renamearaçla birlikte gönderilir. Örneğin, burada Gentoo üzerinde, renamedan sys-apps/util-linuxpaket ve regex desteklemez.

Hamish Downer önerdi mmvözel olarak komut içinde kullanmak için, kullanışlı görünüyor.

Öte yandan, genel durum için yeniden adlandırma yapmak isteyebilirsiniz . Bu sahiptir qmvve qcpseçtiğiniz (benim tercihi: Vim) bir metin düzenleyicisi açılacaktır komutlar, düzenleme sizi ve izin hedef var filenames. Düzenleyiciyi kaydettikten ve kapattıktan sonra, qmv/ qcptüm yeniden adlandırma yapacaktır.

Her ikisi de mmvve qmvdosyaları doğru sırayla yeniden adlandırmak ve aynı zamanda dairesel yeniden adlarını algılamak için yeterince akıllı ve gerekirse otomatik olarak geçici bir dosya yapar.


Gentoo'da ayrıca sys-apps/rename, renamexmregex yeniden adlandırma, toplu büyük / küçük harf ve diğer güzel şeyleri yapacak olan paketi ortaya çıkarabilirsiniz .
radicand

1

Adil olmak:

rename 's/(\w+)-(\w+)-(\d\d)-(\d{4})-NODATA.txt\$1.$4$3$2.log$//' *.txt

bu çıktıyı verir:

Use of uninitialized value $4 in regexp compilation at (eval 1) line 1.
Use of uninitialized value $3 in regexp compilation at (eval 1) line 1.
Use of uninitialized value $2 in regexp compilation at (eval 1) line 1.

Fakat:

rename -n 's/(\w+)-\w+-(\d{2})-(\d{2})-(\d{4})-NODATA\.txt$/$1.$4$3$2\.log/' *.txt && rename 'y/A-Z/a-z/' System.20090101.log

doğru çıktıyı verir:

System-Log-01-01-2009-NODATA.txt renamed as System.20090101.log
System.20090101.log renamed as system.20090101.log

{-n} anahtarının yerine {-v}


1

Bunu yapmak için küçük bir bash betiği oluşturdum:

#!/bin/bash

for f in `ls /path/to/folder`; do
  # Create new filename from the old one
  # This example replaces A (upper case) with a (lower case)
  new_file=`echo "$new_file" | tr A a`

  # Rename the file
  mv "$f" "$new_file"
done

Genel olarak lsçıktıyı ayrıştırma en iyi fikir değildir. Rastgele bir arama, Unix'teki bu uzun okumaları kaldırdı . Eğlence için SE . | Ayrıca cevabınız atr '[:upper:]' '[:lower:]'
HBruijn
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.