Mengganti nama file di linux dengan regex

9

Saya memiliki sekelompok file yang ingin saya beri nama secara konsisten, file-file tersebut dinamai seperti apa

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

Dan saya ingin mereka sebagai huruf kecil, yyyymmdd, ekstensi .log

"system.20090101.log"
"something.20090101.log"
Osama ALASSIRY
sumber

Jawaban:

14

Saya biasa menulis skrip perl untuk melakukan ini, sampai saya menemukan perintah ganti nama.

Ia menerima perl regex untuk melakukan penggantian nama:

untuk ini, saya hanya mengetik dua perintah:

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

Untuk beberapa distro, renametidak memiliki fungsi ini (lihat halaman manualnya), dan Anda mungkin harus menginstal perl-renameatau prename.

Osama ALASSIRY
sumber
jawaban yang sangat bagus
Judioo
8
Hati-hati, beberapa distro mengirimkan perintah ganti nama yang tidak berharga. Periksa distro Anda yang pertama.
derobert
Saya tahu mmvtetapi akhirnya berkat renamesaya dapat menggunakan kekuatan regex
Ludovic Kuty
5
Di Arch Linux ini perl-rename.
Oleh Prypin
6

Karena saya tidak memiliki perintah ganti nama, saya mengandalkan ini:

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

mmv adalah utilitas linux standar untuk memindahkan / mengganti nama banyak file. Ini tersedia dari repo untuk sebagian besar distribusi. Untuk contoh Anda di atas, Anda dapat melakukan:

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

Untuk informasi lebih lanjut, baca artikel debaday ini atau halaman manual .

Hamish Downer
sumber
5

renameutil tidak terlalu "standar". Setiap distro dikirimkan dengan renamealat yang berbeda . Sebagai contoh, di sini di Gentoo, renamedari sys-apps/util-linuxpaket dan tidak mendukung regex.

Hamish Downer menyarankan mmv, tampaknya berguna, khususnya untuk digunakan di dalam skrip.

Di sisi lain, untuk kasus umum, Anda mungkin ingin renameutils . Itu memiliki qmvdan qcpperintah, yang akan membuka editor teks pilihan Anda (preferensi saya: Vim) dan memungkinkan Anda untuk mengedit nama file tujuan di sana. Setelah menyimpan dan menutup editor, qmv/ qcpakan melakukan semua penggantian nama.

Keduanya mmvdan qmvcukup pintar untuk mengubah nama file dalam urutan yang benar dan juga untuk mendeteksi nama melingkar, dan secara otomatis akan membuat file sementara jika diperlukan.

Denilson Sa Maia
sumber
Di Gentoo Anda juga dapat menginstal sys-apps/renamepaket, yang memberi Anda renamexmyang akan melakukan penggantian nama regex serta huruf besar / kecil dan hal-hal baik lainnya.
Radicand
1

Agar adil:

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

memberikan hasil ini:

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.

Tapi:

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

memberikan output yang tepat:

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

mengganti saklar {-n} dengan {-v}

FPBA
sumber
1

Saya membuat skrip bash kecil untuk melakukan ini:

#!/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
bjarkig82
sumber
Secara umum parsing lsoutput bukan ide terbaik. Pencarian acak berhenti membaca gondrong ini di Unix. SE untuk hiburan Anda. | Selain itu jawaban Anda akan lebih cocok dengan pertanyaan dengantr '[:upper:]' '[:lower:]'
HBruijn