En kysele mitään tyyliin "miten muutetaan komentorivillä tiedoston nimi" tai muita vastaavia vaan kyllä mä sen vanhan kunnon mv-komennon tunnen. Ja myös sen rajoitukset.
Nyt on kyse monimutkaisemmasta operaatiosta!
Olisiko kellään antaa neuvoja, vinkkejä, ohjeita miten kasata skripti joka muuttaa tiedoston nimestä kielletyt merkit sellaiseksi ettei ne tuota ongelmaa esim jonkun toisen skriptin kanssa? Mulla on ongelmana ollut tiedoston nimet joissa on välilyönti ja sellastahan monet skriptit ei salli. Mulla on esim. skripti md5summien duunaamiseen rekursiivisesti (siis kahlaa alihakemistot läpi ja tuottaa kaikista niissä olevista tiedostoista md5summat tiedostoksi), vaan tää skripti ei oikein tykkää jos tiedoston nimessä on välilyönti ja siksi skippaa sellaiset tiedostot. Tiedänkin kyllä mistä tuo johtuu, siitä että ohjelma/skripti katsoo että siinä on kaksi eri tiedostoa vaikka kyse on samasta tiedostosta. Lainausmerkkien sisään laittaminenkaan ei onnistu tuossa skriptissä koska siinä on jo yhdet lainausmerkit.
Pitäis siis saada skripti joka korvaa tiedoston (miksei hakemistonkin) nimessä välilyönnin esimerkiksi _ alaviivalla. Ja tarvittaessa vois korvata muitakin kiellettyjä merkkejä toisilla. Osaisko joku antaa neuvoja?
Vielä jos se osaisi kahlata rekursiivisesti hakemistoja niin hyvä, mutta tää ei ole ihan välttämättömyys.
PS. Henkilökohtaisesti olen sitä mieltä että välilyönnit tiedoston nimissä pitäisi kieltää vaikka sitten lailla ja EU-direktiivein, mitään hyvää niistä ei voi seurata ja se on huomattu monet kerrat. :D
Nyt on kyse monimutkaisemmasta operaatiosta!
Olisiko kellään antaa neuvoja, vinkkejä, ohjeita miten kasata skripti joka muuttaa tiedoston nimestä kielletyt merkit sellaiseksi ettei ne tuota ongelmaa esim jonkun toisen skriptin kanssa? Mulla on ongelmana ollut tiedoston nimet joissa on välilyönti ja sellastahan monet skriptit ei salli. Mulla on esim. skripti md5summien duunaamiseen rekursiivisesti (siis kahlaa alihakemistot läpi ja tuottaa kaikista niissä olevista tiedostoista md5summat tiedostoksi), vaan tää skripti ei oikein tykkää jos tiedoston nimessä on välilyönti ja siksi skippaa sellaiset tiedostot. Tiedänkin kyllä mistä tuo johtuu, siitä että ohjelma/skripti katsoo että siinä on kaksi eri tiedostoa vaikka kyse on samasta tiedostosta. Lainausmerkkien sisään laittaminenkaan ei onnistu tuossa skriptissä koska siinä on jo yhdet lainausmerkit.
Pitäis siis saada skripti joka korvaa tiedoston (miksei hakemistonkin) nimessä välilyönnin esimerkiksi _ alaviivalla. Ja tarvittaessa vois korvata muitakin kiellettyjä merkkejä toisilla. Osaisko joku antaa neuvoja?
Vielä jos se osaisi kahlata rekursiivisesti hakemistoja niin hyvä, mutta tää ei ole ihan välttämättömyys.
PS. Henkilökohtaisesti olen sitä mieltä että välilyönnit tiedoston nimissä pitäisi kieltää vaikka sitten lailla ja EU-direktiivein, mitään hyvää niistä ei voi seurata ja se on huomattu monet kerrat. :D
Vastaukset 32
Vanhimmat
rename 's/\s/_/' **/*
Heiiiii, kiitti. Tää rename komentohan toimii, tosin ei ihan tuossa muodossa mitä sä tuohon laitoit vaan tämän sain toimimaan:
rename 'y/ /_/' **/*
En tunne tuota syntaksia kunnolla joten en tiedä mikä funktio on noilla vinoviivoilla sekä s ja y parametreilla mutta kokeilin tuota rimpsua kun katselin man rename ensin ohjeita miten isot kirjaimet muutetaan pieniksi, vaihdoin A-Z:n tilalle tuon välilyönnin ja sehän toimi.
Eli man rename kun komentaa niin tulee ne ohjeet joissa on mm.
rename 'y/A-Z/a-z/' *
Lisäsin sitten vielä tuon **/* jolloin se menee myös alihakemistoihin.
Tää vinkki menee talteen.
Tuli mieleen sellainen asia että eikö kannattaisi ennemmin muuttaa scripti sellaiseksi että toimii? Uudelleennimeäminen voi rikkoa jotakin.
Kertoisitko mitenpä muutat tällaisen skriptin sellaiseksi että se toimii välilyönnillisten tiedostonimienkin kanssa:
find ./ type f name "*"|xargs md5sum >md5summat.md5
Tuo toimii muuten mutta skippaa sellaiset tiedostot joiden nimissä on välilyönti.
Uudelleennimeäminen tuskin rikkoo mitään sellaisenaan, paitsi jos kyseessä on joku sellaisenaan windows-maailmasta linuxille portattu sovellus. Windows-maailmassahan noita välilyöntejä ym. kiellettyjä merkkejä käytetään villisti ja vapaasti.
PS. Saattaa olla että kun tän viestin postaan tänne Suolisto24:ään niin osa tuosta komentorivien merkeistä jää tulostumatta.
ai tällanenkin.. no enpäs huomannut tätä viestiä aiemmin..
#!/bin/bash
IFS="\n"
find ./ type f name "*"|xargs md5sum >md5summat.md5
meniskö ihan tuolla???
Ei tuo tunnu toimivan vaan ilmoittaa ettei tiedostoa tai hakemistoa löydy, joten pitäydyn tuossa renamen käytössä, kiitos silti.
"Mulla on ongelmana ollut tiedoston nimet joissa on välilyönti ja sellastahan monet skriptit ei salli."
"välilyönnit tiedoston nimissä pitäisi kieltää vaikka sitten lailla ja EU-direktiivein, "
ei välilyönneissä mitään vikaa ole. skirpteissäsi on vain vikaa :)
ohjeita kannattaa ihan oikeasti lukea jos meinaa jotain tehdä :D
IFS=\n
man bash
IFS The Internal Field Separator that is used for word splitting
after expansion and to split lines into words with the read
builtin command. The default value is ``''.
paskaa koodia taustalla s24:ssä, kun jättää merkkejä pois. saakelin amatöörit.
Välilyönneissä ON vikaa, koska oikeastaan mikään normaalikomento ei toimi sellaisenaan vaan tiedostonimet pitäisi peittää lainausmerkeillä jotta komennot saa toimimaan. Välilyönneissä on juuri se ongelma että moni komento luulee että kyseessä on useampi tiedosto peräkkäin kirjoitettuna vaikka kyseessä olisi yksi ja sama tiedosto. Siis kun käytetään komentoriviä ja sen komentoja.
Välilyöntejä ei pitäisi käyttää missään vaan niiden tilalle alaviivat, sellaisen suosituksen olen nähnyt jossain muuallakin eikä liene ihan tuulesta temmattu.
Välilyönnin sisältävät tiedostonimet ei toimi sellaisenaan edes windowsissa jos komentoriviä käyttää, windowsissakin pitää tiedostonimet peittää lainausmerkeillä.
Ja kertoisitko muuten mitä vikaa on tuossa yllä olevassa viestissä olevassa skriptissä, siis sinun mielestäsi?
ei niissä välilyönneissä ole mitään vikaa, usko jo :)
vastauksenkin jo annoin. en tiedä luitko sitä.
"IFS=\n
man bash
IFS The Internal Field Separator that is used for word splitting
after expansion and to split lines into words with the read
builtin command. The default value is ``''.""
sun on syytä vaihtaa alaa kun noin perusasiatkaan ei suju.
Voitko häipyä suolle vittuilemasta! Kyllä perusasiat sujuu, mut tämä on niin laaja juttu että kaikilla riittää opittavaaa. Myös sulla, jos ei muuten niin sun käytös kusee ja pahasti ja siinä sulla onkin opeteltavaa että lopetat vittuilun!
samat sanat kuin edellisellä vastaajalla(aloittajalla?).
mene muualle kitisemään.
bash skriptaus on aikas tarkkaa puuhaa ja ei sitä kukaan pysty hallitsemaan täydellisesti. sitäpaitsi se ei ole mikään "perusasia". perusasia on joku pakettimanagerin kliksuttelu ja netissä surffaus.
IFS korjaa välilyöntiongelman.
Kiitos sulle /7\|/7\, sä sentään ymmärrät ja tiedät ettei noita asioita tosiaan imetä äidinmaidossa vaan kaikki on joskus joutuneet kantapään kautta, kyselemällä ja muuten opiskelemalla opettelemaan nuo asiat, se on seikka joka lienee unohtunut täysin nimimerkiltä "voi voi". :)
Peruskäytön hallitsen sekä komentoriviäkin kyllä osaan käyttää, mutta tosiaan kuten sanoit, tuo bash on niin laaja asia ettei sitä voi millään kaikkea oppia yhdessä yössä. Itse en esim. tiennyt tuosta rename-komennostakaan, tiesin jo ennen linuxin käytön aloittamista aikoinaan että normaalisti nimeäminen tehdään mv-komennolla eli samalla jolla voidaan myös siirtää tiedostoja ja hakemistoja paikasta A paikkaan B. Mutta taas tuli opittua jotain uutta. :)
BTW, tulen kokeilemaan tuota 17:37 viestissäsi ehdottamaasi juttua myös. Ainoa ero näköjään omaan skriptiini on se että siinä on tuo IFS=\n komento. Kiitti siitäkin vinkistä.
joo, en kokeillut tuota juttuani ollenkaan. heitin sen vaan ihan hihasta.
tässä on vähän erilaisia ratkaisuja. tuo xargs sössii koko homman
find -type f -exec md5sum "{}" > md5summat.md5 \;
man xargs
-0 Change xargs to expect NUL (``\0'') characters as separators,
instead of spaces and newlines. This is expected to be used in
concert with the -print0 function in find(1).
find . -type f .print0 | xargs -0 md5sum >md5summat.md5
:)
toinen mikä pistää miettimää on että mitä tuo md5sum edes tekee? laskee md5summan jonka sitten kirjoittaa md5summat tiedostoon?? ja seuraavan kohdalla ylikirjoittaa edellisen tiedoston( > ) ??? eli käytännössä se ei tee mitään ja kuitenkin niin paljon?
find -type f -exec md5sum "{}" >> md5summat.md5 \;
find . -type f .print0 | xargs -0 md5sum >> md5summat.md5
Kerro nyt mitä VIKAA välilyönneissä on, muuta kuin ettet osaa niitä käyttää?
eipä tunnu olevan sinulla sen enempää tietoa asiasta, pelkkää tyhjänpäiväistä narinaa.
Ai etten osais niitä (välilyöntejä) käyttää? Katso itse tollo, vaikka mun viestejäni. Osaan kyllä käyttää välilyöntejä. Kyse onkin siitä että moni sovellus ei sellaisenaan ymmärrä välilyöntejä sisältäviä tiedostonimiä vaan kuvittelee kyseessä olevan useamman tiedoston. Jos esim. yritän ottaa md5summan vaikka "pitkä tiedoston nimi.txt" nimisestä tiedostosta ja kirjoitan tuon ilman että laitan tiedoston nimen lainausmerkkien sisään, md5sum kuvittelee että kyseessä on 3 eri tiedostoa! Ja mitä lainausmerkkeihin tulee, niitä en voi käyttää tuolla tavalla tiedoston nimen kanssa silloin kun käytän skriptejä.
Menikö nyt jakeluun nimimerkille voi voi alias vikaa vikaa??? Ja tosiaan voisit häipyä täältä kettuilemasta. Jotenkin mulla on lisäksi tunne että sä et osaa linux-juttuja senkään vertaa mitä mä osaan. Suutasi kyllä osaat soittaa mutta siihen osaamisesi sitten jääkin!
"joo, en kokeillut tuota juttuani ollenkaan. heitin sen vaan ihan hihasta.
tässä on vähän erilaisia ratkaisuja. tuo xargs sössii koko homman"
Mä taas luin jostain että nimenomaan pitää olla tuo xargs, jotta tuo putkitus eli pipe ei menisi ihan tukkoon.
"find -type f -exec md5sum "{}" > md5summat.md5 \;
man xargs
-0 Change xargs to expect NUL (``\0'') characters as separators,
instead of spaces and newlines. This is expected to be used in
concert with the -print0 function in find(1).
find . -type f .print0 | xargs -0 md5sum >md5summat.md5"
Täytyy joskus kokeilla noita.
"toinen mikä pistää miettimää on että mitä tuo md5sum edes tekee? laskee md5summan jonka sitten kirjoittaa md5summat tiedostoon?? ja seuraavan kohdalla ylikirjoittaa edellisen tiedoston( > ) ??? eli käytännössä se ei tee mitään ja kuitenkin niin paljon?"
Joo, se tosiaan laskee md5summan ja kirjoittaa tiedostoon. Mutta se ei ylikirjoita vaan lisää edellisten summien perään eli siis mitään aiempaa md5summaa ei tuossa tuhoudu. Homma toimii ihan hyvin muuten paitsi nuo välilyöntejä sisältävät tiedostonimet on ongelmana ja sillä on hyvä tarkistaa onko jokin tiedosto muuttunut, vaikkapa levy- tai muun laitehäiriön takia. Mulla esim. on ongelmallinen tuo yhden koneen usb-portti jossa käytän varmuuskopiointilaitteita, se tuntuu toimivan "auringonpilkkujen mukaan" ja siksi haluan varmistua että tieto on kirjoittunut varmuuskopiointimedialle oikein.
"find -type f -exec md5sum "{}" >> md5summat.md5 \;
find . -type f .print0 | xargs -0 md5sum >> md5summat.md5 "
Mä epäilen että ainoa mikä tuossa auttaisi on se että saisi jotenkin tuon skriptin laittamaan tiedoston nimet lainausmerkkien sisään, tuo md5sum ei muuten osaa edes yksittäistäkään tiedostoa laskea jos sen tiedoston nimessä on välilyöntejä. Tai sitten tosiaan muuntaa ne välilyönnit ensin underscoreksi eli alaviivoiksi. Tuo mainitsemasi rename-konsti kyllä auttaa. No, Ubuntuissa ja sen sisarversioissa toki on mahdollisuus massanimetä ja käyttää etsi-korvaa toimintoa mutta käytän toki muitakin jakeluita joissa moista ei välttämättä ole.
Ai niin, ei tuota tupla > merkkiä tarvita, yksi > merkkikin kyllä riittää. Windowsissa voi olla niin että tarvitaan tuplamäärä ettei ylikirjoittaisi aiempia mutta linuxeissa tuo yksi > ei ylikirjoita aiempia md5summia vaan lisää edellisten jatkeeksi.
"Mä taas luin jostain että nimenomaan pitää olla tuo xargs, jotta tuo putkitus eli pipe ei menisi ihan tukkoon."
joo on hyvä jos on paljon tiedostoja.
"Mä epäilen että ainoa mikä tuossa auttaisi on se että saisi jotenkin tuon skriptin laittamaan tiedoston nimet lainausmerkkien sisään, tuo md5sum ei muuten osaa edes yksittäistäkään tiedostoa laskea jos sen tiedoston nimessä on välilyöntejä."
eikä tarvitse. noilla kaikilla kolmella esimerkillä toimii. kun ei siis pysähdytä välilyöntiin tai johonkin muuhun vaan "\n".
"Ai niin, ei tuota tupla > merkkiä tarvita, yksi > merkkikin kyllä riittää. Windowsissa voi olla niin että tarvitaan tuplamäärä ettei ylikirjoittaisi aiempia mutta linuxeissa tuo yksi > ei ylikirjoita aiempia md5summia vaan lisää edellisten jatkeeksi."
mulla alkaa nyt huumorintaju ihan oikesti loppumaan(röllit liikkeellä???).
COMMAND_OUTPUT >
# Redirect stdout to a file.
# Creates the file if not present, otherwise overwrites it.
COMMAND_OUTPUT >>
# Redirect stdout to a file.
# Creates the file if not present, otherwise appends to it.
mitä allaoleva mielestäsi mahtaa tarkoittaa? entäs yllä oleva?
"man xargs
-0 Change xargs to expect NUL (``\0'') characters as separators,
instead of spaces and newlines. This is expected to be used in
concert with the -print0 function in find(1)."
Älä kadota hyvä ihminen huumorintajuasi, vaikka tosin ei tässä huumorista olekaan kyse vaan ihan tosijutusta. Ei siis ole trollit liikkeellä.
Mulla tuo yhden > merkin käyttö on toiminut toistaiseksi eikä ole ylikirjoittanut. Mitä jakelua sä käytät? Mulla säännöllisessä (jokapäiväisessä käytössä Xubuntu ja Puppy Linux), molemmissa on tuo toiminut ihan yhdellä > merkillä ja lisää vanhan tekstin perään uutta eikä ole ylikirjoittanut joten outoa jos sulle herjaa tuollaista että ylikirjoittaisi.
Täytyy tohon xargsiin tutustuu joskus paremmalla ajalla syvemmin, mut nyt täytyy vielä käytellä tota tiedostonnimeämissysteemiä eli vaihtaa välit underscoreiksi.
Noi regular expressions-jututkin vähän vielä vaatii tarkempaa tutustumista.
Mutta kärsivällisyyttä, kukaan meistä ei ole seppä syntyessään ja nää jutut joutuu opettelemaan (vaikka tuo voi voi/vikaa vikaa kai kuvittelee että jokainen saa nuo tiedot äidinmaidossaan, jos se sitten ees osaa itsekään puoliakaan noista).
> tosiaan ylikirjoittaa tiedoston.
ilmeisesti md5sum saa xargs:lta listan tiedostoista ja tyrkkää ne sitten tiedostoon yhdellä kertaa. toki se > ylikirjoittaa mahdollisen jo olemassa olevan tiedoston.
> toimii samalla tavalla kaikissa *nix seissa ja linux distroissa.
"Täytyy tohon xargsiin tutustuu joskus paremmalla ajalla syvemmin, mut nyt täytyy vielä käytellä tota tiedostonnimeämissysteemiä eli vaihtaa välit underscoreiksi."
ei tarvitse nimetä uudestaan, mutta toki niin saa tehdä jos haluaa..
find . -type f -print0 | xargs -0 md5sum >> md5summat.md5
kyllä ottaa myös välilyönnilliset messiin.
> jos halutaan korvata edellinen md5summat.md5 ja >> jos halutaan jatkaa tiedostoon lisää uutta dataa..
esimerkki > ja >>
#>
echo "blaa" > testi.txt
cat testi.txt
blaa
echo "bojoing" > testi.txt
cat testi.txt
bojoing
#>>
echo "blaablaa" >> testi.txt
cat testi.txt
bojoing
blaablaa
"vaikka tuo voi voi/vikaa vikaa kai kuvittelee että jokainen saa nuo tiedot äidinmaidossaan, jos se sitten ees osaa itsekään puoliakaan noista"
kyseinen on vain turhan räkyttäjä, joita täällä riittää. ei se mitään itse osaa.
"moni sovellus ei sellaisenaan ymmärrä välilyöntejä sisältäviä tiedostonimiä vaan kuvittelee kyseessä olevan useamman tiedoston"
Onpas linuxissa paskat sovellukset.
jos et olisi tyhmä, niin tietäisit että paskawindowsisi säälittävä komentorivi toimii aivan samalla tavalla.
mulk-ku-jen ei kannata alkaa selittää mitään asioista, joista eivät ymmärrä mitään.
"Onpas linuxissa paskat sovellukset."
eikä ole. ne toimivat juuri siten kuin ne on määritelty toimivan.
mulk-ku-jen ei edelleenkään kannata vinkua asioista joista eivät ymmärrä mitään.
tavutin sanan mulk-ku ihan sinua varten, että ymmärtäisit(ehkä?)
saapa nähdä, meneekö filtterin läpi.
:)
Taidat tykätä paskan puhumisesta.
perusteletko vinkumisesi?
"> tosiaan ylikirjoittaa tiedoston.
ilmeisesti md5sum saa xargs:lta listan tiedostoista ja tyrkkää ne sitten tiedostoon yhdellä kertaa. toki se > ylikirjoittaa mahdollisen jo olemassa olevan tiedoston."
Joo ilmeisesti tuo menee noin. Toki sitten se itse md5summa-tiedosto pitää nimetä siten että esim. jos tekee päivittäin tuollaisen summatiedoston niin sen md5summa-tiedoston nimeen laitetaan esimerkiksi myös päiväys, sellainenkin skripti mulla on joka lisää päiväyksen ja kellonajan, en vaan nyt muista ulkoa ja se skripti on toisella koneella.
"> toimii samalla tavalla kaikissa *nix seissa ja linux distroissa.
"Täytyy tohon xargsiin tutustuu joskus paremmalla ajalla syvemmin, mut nyt täytyy vielä käytellä tota tiedostonnimeämissysteemiä eli vaihtaa välit underscoreiksi."
ei tarvitse nimetä uudestaan, mutta toki niin saa tehdä jos haluaa..
find . -type f -print0 | xargs -0 md5sum >> md5summat.md5
kyllä ottaa myös välilyönnilliset messiin."
Ahaa, tuota pitää kyllä kokeilla.
"> jos halutaan korvata edellinen md5summat.md5 ja >> jos halutaan jatkaa tiedostoon lisää uutta dataa..
esimerkki > ja >>
#>
echo "blaa" > testi.txt
cat testi.txt
blaa
echo "bojoing" > testi.txt
cat testi.txt
bojoing
#>>
echo "blaablaa" >> testi.txt
cat testi.txt
bojoing
blaablaa"
Mä en ole tehnyt linuxin puolella kovin paljon testejä noilla > merkeillä, mutta pitääpä testata, sen vaan muistan windows-ajoilta että windowsissa tosiaan ylikirjoittaa jos ei käytä kahta > merkkiä.
""vaikka tuo voi voi/vikaa vikaa kai kuvittelee että jokainen saa nuo tiedot äidinmaidossaan, jos se sitten ees osaa itsekään puoliakaan noista"
kyseinen on vain turhan räkyttäjä, joita täällä riittää. ei se mitään itse osaa. "
Sitä mäkin vähän epäilen, noita riittää jokaiselle foorumille omansa. :)
minä oon paukuttanu komentoriviä jo about 20 vuotta ja se alkaa jo vituttamaan pikkuhiljaa.. onneks ei tarvii enää muuta kuin harrastaa sitä tai han mitä oikeestaan huvittaa :)
yleensä meson täällä, kun ei viiti tehdä mitään..
Siis haluat jotain skriptiä joka laskee md5 summat tiedostoille? Tämä tulostaa md5 summat tiedostoille rekursiivisesti kaikista alikansioista.. todennäköisesti ei tällaisenaan tee mitä haluat, mutta onpahan jotain mistä lähteä liikkeelle jos huvittaa. Tässä on md5 summan laskeva funktio mukana, mutta se on helppo korvata md5sum ohjelmalla jos niin haluat. En jaksa/kerkii nysvätä enempää nyt :)
toivottavasti tämä paste nyt toimii (sormet ristiin - ja anteeks jos tuli vain sotkua)
Tallenna md5foo.py nimellä. Testattu python2.7:llä, ei tietoa toimiiko 2.6 tai aiemmalla
#!/usr/bin/env python
# -*- coding: utf-8 -*-
import sys
import os
import hashlib
def md5foo(f):
md5obj = hashlib.md5()
data = f.read(1024)
while(data != ""):
md5obj.update(data)
data = f.read(1024)
return md5obj.hexdigest()
def main(argv=None):
if argv is None:
argv = sys.argv
if len(argv) != 2:
print >>sys.stderr, "Usage: md5foo path"
return 2
for dirpath, dirnames, filenames in os.walk(argv[1]):
for fname in filenames:
f = open(os.path.join(dirpath, fname), 'rb')
print "%s *%s" % (md5foo(f), fname)
return 1
if __name__ == "__main__":
sys.exit(main())
aika hurjan työn teit tämän asian takia, kun siihen on olemassa kuitenkin se yhden rivin ratkaisu :)
Heh, oli hieman tylsää iltasella niin siinähän tuo kaljotellessa. Ei tuossa nyt kauan mennyt. Pari pikku vikaa siitä kyllä heti iskee silmään mut eikai se niin vakavaa :)
Vielä pikkukorjaus jos joku tuosta oikeasti haluais jotain hyödyntää. Tuon return 1 ei kuuluis olla tuolla joten se pois