Kirjoittaja Aihe: Uudelleen nimeäninen - nimet tiedostosta.  (Luettu 3537 kertaa)

mhavo

  • Käyttäjä
  • Viestejä: 24
    • Profiili
Uudelleen nimeäninen - nimet tiedostosta.
« : 03.06.07 - klo:17.01 »
 ???

Kansiossa on tiedostoja 01.wav, 02.wav jne. Tiedosto filenames.txt sisältää pitkät nimet yksi per rivi. Filenames2.txt sisältää rivejä siten, että ensin rivin alussa on 01 ja sitten pilkun jälkeen pitkä nimi.

Haluan siis nimetä nuo raidat pitkällä nimellä.


Olen kokeillut awk:a seuraavasti:


Koodia: [Valitse]
echo `awk -F"," '{print $1".wav", $2".wav"}' filenames2.txt`
Tästä tulee ulos samalla rivillä se mitä haluan... mutta jostakin syystä awk ei tavallisuudesta poiketen jaa tuota tulostetta riveille. Mikään "\n" ei myöskään auta.


Ja sitten vähän monimutkaisempaakin for-looppia:

Koodia: [Valitse]
ii=01;for ll in $(cat filenames.txt); do echo mv $(echo $ii | awk '{printf("%02g",$1)}').wav "$ll.wav"; ii=$((ii+01)); done
Tämä ei kyllä ollut mikään menestys... vuotaa yli tuossa...


Osaisiko joku auttaa?

SuperOscar

  • Käyttäjä
  • Viestejä: 4063
  • Ocatarinetabellatsumtsum!
    • Profiili
    • Legisign.org
Vs: Uudelleen nimeäninen - nimet tiedostosta.
« Vastaus #1 : 04.06.07 - klo:11.52 »
Mää mitää tiä, mutta jos Filenames2.txt sisältää kaiken tarpeellisen, miksi ihmeessä käydä läpi muuta kuin sitä?

Pythonilla homma hoituisi jotenkin näin:
Koodia: [Valitse]
#!/usr/bin/python
import os
f = file('Filenames2.txt', 'r')
for s in f:
    vanha, uusi = s.split(',')
    vanha = vanha.strip() + '.wav'
    uusi = uusi.strip() + '.wav'
    os.rename(vanha, uusi)
f.close()
pöytäkone 1, NUC: openSUSE Leap 15.6, kannettavat 1–3: Debian GNU/Linux 12; pöytäkone 2: openSUSE Tumbleweed; RPi 1: FreeBSD 14-RELEASE; RPi 2: LibreELEC 11

SuperOscar

  • Käyttäjä
  • Viestejä: 4063
  • Ocatarinetabellatsumtsum!
    • Profiili
    • Legisign.org
Vs: Uudelleen nimeäninen - nimet tiedostosta.
« Vastaus #2 : 04.06.07 - klo:12.00 »
Och samma på awk jotenkin näin kai:
Koodia: [Valitse]
#!/usr/bin/gawk -F
{
    split($0, nimet, ",")
    system("mv " nimet[1] " " nimet[2])
}

(Tuo siis hoitaisi jos sen uudelleennimeämisen.)
« Viimeksi muokattu: 04.06.07 - klo:13.26 kirjoittanut SuperOscar »
pöytäkone 1, NUC: openSUSE Leap 15.6, kannettavat 1–3: Debian GNU/Linux 12; pöytäkone 2: openSUSE Tumbleweed; RPi 1: FreeBSD 14-RELEASE; RPi 2: LibreELEC 11

mhavo

  • Käyttäjä
  • Viestejä: 24
    • Profiili
Vs: Uudelleen nimeäninen - nimet tiedostosta.
« Vastaus #3 : 04.06.07 - klo:19.56 »
Kiitos... yksi pääpointti jäi sanomatta.

'Kielillä' tämän kyllä osaan. Ja winkkarin komentorivillä. Nyt vain harmitti kun ei osannutkaan linukan komentoriville loihtia kätevää komentoa. Sitä vaan haluaa säätää  ;D

SuperOscar

  • Käyttäjä
  • Viestejä: 4063
  • Ocatarinetabellatsumtsum!
    • Profiili
    • Legisign.org
Vs: Uudelleen nimeäninen - nimet tiedostosta.
« Vastaus #4 : 04.06.07 - klo:23.10 »
Oukei... Harhautti tuo kun käytit esimerkeissäsi kumminkin awkia. Itse en viitsisi kovin monimutkaista sh/bash/zsh-skriptiä kirjoittaa, jos saman hoitaa suit sait Pythonilla.
pöytäkone 1, NUC: openSUSE Leap 15.6, kannettavat 1–3: Debian GNU/Linux 12; pöytäkone 2: openSUSE Tumbleweed; RPi 1: FreeBSD 14-RELEASE; RPi 2: LibreELEC 11

mgronber

  • Käyttäjä
  • Viestejä: 1458
    • Profiili
Vs: Uudelleen nimeäninen - nimet tiedostosta.
« Vastaus #5 : 05.06.07 - klo:01.00 »
Oukei... Harhautti tuo kun käytit esimerkeissäsi kumminkin awkia. Itse en viitsisi kovin monimutkaista sh/bash/zsh-skriptiä kirjoittaa, jos saman hoitaa suit sait Pythonilla.

Tämän kommentin johdosta oli pakko kirjoittaa bash-skripti ihan vain osoituksena ettei sekään ole tässä tapauksessa monimutkainen.

Koodia: [Valitse]
#!/bin/bash

[ $# -eq 0 ] && echo "Usage: $(basename "$0") FILE ..." && exit 1

while [ $# -gt 0 ]; do
    cat "$1" \
    | while read line; do
        src="$(echo "$line" | cut -d, -f1)"
        dst="$(echo "$line" | cut -d, -f2-)"
        mv "$src.wav" "$dst.wav"
    done
    shift
done


EDIT: Lisätään tähän nyt vielä Tcl-versio kun sellaisenkin menin tekemään...
Koodia: [Valitse]
#!/bin/sh
# the next line restarts using tclsh \
exec tclsh "$0" "$@"

if { $argc == 0 } {
    puts "Usage: $argv0 FILE ..."
    exit 1
}

foreach {arg} $argv {
    set fp [open $arg r]
    foreach {line} [split [read $fp] "\n"] {
        if { [regexp -- {^([^,]+),(.+)$} $line -> old new] } {
            file rename $old $new
        }
    }
    close $fp
}
« Viimeksi muokattu: 05.06.07 - klo:13.17 kirjoittanut mgronber »