Sida 1 av 1
Massnamnbyte
Postat: 30 apr 2009, 05:28
av Johnny Rosenberg
Jag brukar använda GPRename för att byta namn på många filer samtidigt men den saknar en massa finesser, varav jag knappast kommer att behöva de flesta av dem, men just nu saknar jag en möjlighet att namnge ett antal länkar slumpmässigt. Det spelar mig ingen större roll vad filnamnen blir exakt, det kan vara enbart siffror eller vad som helst, men filtillägget ska inte ändras.
Jag har perl-varianten av rename installerad. Kan den vara en väg att gå? Förmodligen, men jag är för ovan vid perl-uttryck för att inse hur eller ens om det är möjligt att hantera slumpmässiga strängar på ett eller annat sätt.
Re: Massnamnbyte
Postat: 30 apr 2009, 07:52
av jsiei97
Johnny Rosenberg skrev:Jag har perl-varianten av rename installerad. Kan den vara en väg att gå? Förmodligen, men jag är för ovan vid perl-uttryck för att inse hur eller ens om det är möjligt att hantera slumpmässiga strängar på ett eller annat sätt.
Luktar regexp lång väg... och förvånansvärt mycket är möjligt med regexp:ar

Re: Massnamnbyte
Postat: 30 apr 2009, 09:28
av Konservburk
Johnny Rosenberg skrev:Jag brukar använda GPRename för att byta namn på många filer samtidigt men den saknar en massa finesser, varav jag knappast kommer att behöva de flesta av dem, men just nu saknar jag en möjlighet att namnge ett antal länkar slumpmässigt. Det spelar mig ingen större roll vad filnamnen blir exakt, det kan vara enbart siffror eller vad som helst, men filtillägget ska inte ändras.
Jag hänger inte riktigt med på vad du försöker åstadkomma. Varför vill du ha sumpmässiga namn? Är det så att du vill generera helt unika filnamn?
Re: Massnamnbyte
Postat: 30 apr 2009, 16:43
av Johnny Rosenberg
Konservburk skrev:Johnny Rosenberg skrev:Jag brukar använda GPRename för att byta namn på många filer samtidigt men den saknar en massa finesser, varav jag knappast kommer att behöva de flesta av dem, men just nu saknar jag en möjlighet att namnge ett antal länkar slumpmässigt. Det spelar mig ingen större roll vad filnamnen blir exakt, det kan vara enbart siffror eller vad som helst, men filtillägget ska inte ändras.
Jag hänger inte riktigt med på vad du försöker åstadkomma. Varför vill du ha sumpmässiga namn? Är det så att du vill generera helt unika filnamn?
Jag bara vill det… Inte på hela hårddisken givetvis, utan bara i en enda mapp i experimentsyfte.
Men det spelar ingen roll varför, för oavsett orsak ställde jag frågan för att jag ville veta svaret på den. Det jag vill åstadkomma kan jag åstadkomma på andra sätt, men nu vill jag veta om det går att åstadkomma det på just detta sättet, nämligen med en mapp en länkar som har slumpmässiga namn…
Om det inte går är det ju skönt att veta det så slipper man lägga ner hur många timmar som helst helt i onödan. Tänkte att någon kanske labbat med detta tidigare, men det är visst bara jag som kommer på så korkade idéer…
Re: Massnamnbyte
Postat: 30 apr 2009, 17:17
av Konservburk
Johnny Rosenberg skrev:Jag bara vill det… Inte på hela hårddisken givetvis, utan bara i en enda mapp i experimentsyfte.
Men det spelar ingen roll varför, för oavsett orsak ställde jag frågan för att jag ville veta svaret på den. Det jag vill åstadkomma kan jag åstadkomma på andra sätt, men nu vill jag veta om det går att åstadkomma det på just detta sättet, nämligen med en mapp en länkar som har slumpmässiga namn…
Jag skiter egentligen fullständigt i syftet. Men jag förstår fortfarande inte riktigt vad du vill göra? Jag frågade om de slumpmässiga namnen ska vara unika? Och om inte, vad gör du om det uppstår en namnkollision? Sen har vid det här med länkarna... hur kommer dessa in i bilden?
Johnny Rosenberg skrev:Om det inte går är det ju skönt att veta det så slipper man lägga ner hur många timmar som helst helt i onödan. Tänkte att någon kanske labbat med detta tidigare, men det är visst bara jag som kommer på så korkade idéer…
Det borde inte vara någon större svårighet att generera slumpmässiga filnamn/länknamn.
Re: Massnamnbyte
Postat: 30 apr 2009, 19:21
av gusse02
Kanske du ska använda UUID (universally unique identifier). Det finns ett program som heter uuidgen som genererar slumpmässiga, unika namn/identifierare som du skulle kunna använda för att namnge dina filer.
Se "man uuidgen". Eller för den delen "apropos uuid".
Re: Massnamnbyte
Postat: 30 apr 2009, 20:53
av jsiei97
Johnny Rosenberg skrev:Jag bara vill det… Inte på hela hårddisken givetvis, utan bara i en enda mapp i experimentsyfte.
Men det spelar ingen roll varför, för oavsett orsak ställde jag frågan för att jag ville veta svaret på den. Det jag vill åstadkomma kan jag åstadkomma på andra sätt, men nu vill jag veta om det går att åstadkomma det på just detta sättet, nämligen med en mapp en länkar som har slumpmässiga namn…
Om det inte går är det ju skönt att veta det så slipper man lägga ner hur många timmar som helst helt i onödan. Tänkte att någon kanske labbat med detta tidigare, men det är visst bara jag som kommer på så korkade idéer…
Tja, slumptal finns lite här och där...
Vad sägs om att leka lite med:
(glöm inte att avbryta efter en stund....)
Dvs du kan läsa tecken för tecken från /dev/urandom och lägga dessa där du vill ha dom...
ovan fyllde bara en fil med slumpmässig data
Fast om du gillar perl mer så finns ju "rand" funktionen att tillgå,
här en liten grovhuggen som bara skriver ut några tecken...
Kod: Markera allt
#!/usr/bin/perl
$data = "";
for($i=0;$i<30;$i++)
{
$data .= sprintf("%c", (rand(25)+97));
}
print "random data: ".$data."\n";
Sedan kan du använda denna sträng när du döper dina filer.
/Johan
Re: Massnamnbyte
Postat: 30 apr 2009, 21:03
av jsiei97
Eller vad sägs om att göra båda på samma gång...?
Kod: Markera allt
#!/usr/bin/perl
$data = "";
for($i=0;$i<30;$i++)
{
$data .= sprintf("%c", (rand(25)+97));
}
print "random data: ".$data."\n";
system("head /dev/urandom > ".$data.".txt");
Här har du ett fulhack som skapar en fil med ett slumpartat namn och sedan tar lite lagom med slumpmässig data att fylla den med
Totalt meningslöst, dock underhållande på något vis...
/Johan
Ett tips eftersom ovan fil är fylld med lite lagom märklig data, så kan du titta på denna med t.ex. hexdump eller dyl.
(Använd inte cat eller more om du inte känner till reset

)
Re: Massnamnbyte
Postat: 01 maj 2009, 02:40
av Johnny Rosenberg
Konservburk skrev:Jag skiter egentligen fullständigt i syftet.
Låter trevligt…
Konservburk skrev:Men jag förstår fortfarande inte riktigt vad du vill göra?
Jag har en mapp med en massa länkar. Dessa länkar leder alla till bilder i olika mappar. Jag kunde givetivis lika gärna kopierat alla bilderna till mappen, men jag tyckte det var onödigt slöseri med utrymme. En länk tar ju inte upp så värst många bytes.
Nu vill jag inte att länkarna ska heta samma som filerna de pekar på och jag bryr mig inte heller om vad de heter, mer än att namnen ska vara slumpmässiga.
Konservburk skrev:Jag frågade om de slumpmässiga namnen ska vara unika? Och om inte, vad gör du om det uppstår en namnkollision?
Ja, de ska vara unika, men om man bara låter namnen vara tillräckligt långa så blir ju sannolikheten obefintlig att två filer av ett hundratal skulle råka få samma namn. Det gör inget om namnet består av empelvis ett tjugotal siffror.
Konservburk skrev:Sen har vid det här med länkarna... hur kommer dessa in i bilden?
Det var väl mest det att jag från början pratade om filer men sedan kom på att det faktiskt var frågan om länkar istället. Det borde ju inte spela någon roll ur namnbytarsynpunkt heller, i och för sig.
Och till sist, om någon vill veta vad jag är ute efter här, så är det bara en tokidé jag fick för att lösa ett litet problem. Jag skulle titta på en stor mängd valda bilder i F-spot, har jag för mig att det var. Tyvärr hittade jag inte något i någon inställning om hur man visar bilderna i slumpmässig ordning, vilket jag tyckte kändes lite sopigt. Alla liknande program jag tidigare använt för liknande ändamål, på den tiden i Windows, har haft den ”finessen”.
Så jag bara kände för att tillämpa en liten nödlösning, som gick ut på att jag samlade alla bilder i en mapp i form av länkar till de riktiga bilderna och tittade på dem i bokstavsordning. Om jag då hade slumpmässiga namn på bilderna (länkarna alltså) så skulle ju bildspelet också bli slumpmässigt (med den lilla begränsningen att det blir samma ordning varje gång). När jag då inte fann något enkelt sätt att göra detta på, alltså att byta namn på existerande filer eller länkar till ett slumpmässigt namn var jag ju bara tvungen att veta om det är möjligt och i så fall hur på enklaste sätt.
Visst visste jag att det var möjligt. Om inte annat kan man ju alltid knåpa ihop ett enkelt C-program som gör jobbet, men nu fick jag för mig att jag ville veta om någon visste något riktigt elegant sätt att göra detta på… Det är ju alltid lika frustrerande när man löst ett problem på ett tidsödande sätt och när man visar någon sin lösning, så säger vederbörande nästan alltid ”varför gjorde du inte så här istället” varpå han förslår en metod som är så enkel att man riktigt känner hur mycket tid man lagt ner helt i onödan…
På något märkligt sätt så är det alltid de meningslösa problemen som fångar min uppmärksamhet mest också, som man tydligt kan se här…
Tack för alla svar. Ska ta en titt och se om något känns mer ”rätt” för mig än de andra.
Re: Massnamnbyte
Postat: 01 maj 2009, 03:07
av David Andersson
Om du vill använda perl-varianten av rename skulle du kunna göra nåt sånt här
Kod: Markera allt
prename 's/(.*)/sprintf("%03d",rand(1000))/e' *
Substituering med s/xxx/yyy/
e gör att yyy inte är en sträng att substituera till utan ett uttryck vars värde används. Lägg till flaggorna
-v för att se vad som händer och
-n för att inte ändra några filnamn medan du testar uttrycken.
Obs ovanstående garanterar inte unika namn, och behåller inte filnamnsuffix. Denna bör ger unika namn:
Re: Massnamnbyte
Postat: 01 maj 2009, 03:41
av David Andersson
Johnny Rosenberg skrev:Om jag då hade slumpmässiga namn på bilderna (länkarna alltså) så skulle ju bildspelet också bli slumpmässigt
Bildvisningsprogram finns det tretton på dussinet i förråden. Många kan slideshowa och många slumpvis skulle jag tro. (T.ex eog, gqview, feh, qiv, xli, m.fl. och (ahum) pornview)
Exempel
xli -delay 2 *.png visar bilder i bokstavsordning 2 sekunder var.
Man kan låta *.png komma i omvänd ordning med $(ls *.png | tac) eller slumpvis ordning med $(ls *.png | shuf). Exempel
xli -delay $(ls *.png | shuf)
Man kan göra ls-ordningen slumpvis, inte genom att
ersätta filnamnet utan genom att
prefixa det med ett slumptal. Exempel
prename 's/(.*)/sprintf("%03d-%s",rand(1000),$1)/e' *
Det blir slumpordnat men filnamnet finns kvar om man behöver identifiera filerna/länkarna.
men filtillägget ska inte ändras.
Filnamn behöver oftast inte ha filtillägg. Xli i exemplen ovan (och de flesta program) öppnar gladeligen bilder av alla möjliga typer utan att bry sig om filtillägg. Tänk på filtillägg mer som en hjälp för människan att se vad det är för slags fil, eller som ett arv från Windows.
Re: Massnamnbyte
Postat: 01 maj 2009, 10:43
av Johnny Rosenberg
David Andersson skrev:Bildvisningsprogram finns det tretton på dussinet i förråden. Många kan slideshowa och många slumpvis skulle jag tro. (T.ex eog, gqview, feh, qiv, xli, m.fl. och (ahum) pornview)
Kan i alla fall direkt utesluta Eog där, i alla fal den version som finns installerad som standard. Inställningar → Bildspel är bland de magraste jag sett. Går bara att ställa in tre saker och ingen av dem har med slumpmässighet att göra. De andra har jag inte provat, men den sistnämnda verkar ju vara en given kandidat att testa härnäst…
David Andersson skrev:Filnamn behöver oftast inte ha filtillägg. Xli i exemplen ovan (och de flesta program) öppnar gladeligen bilder av alla möjliga typer utan att bry sig om filtillägg. Tänk på filtillägg mer som en hjälp för människan att se vad det är för slags fil, eller som ett arv från Windows.
Jo, jag känner till detta. Utvecklarna av Eog verkar dock inte ha hört talas om det över huvud taget. Byt namn på en jpg till gif och Eog är totalt bortkollrad direkt. Jag har provat, så jag vet… Däremot testade jag nyss att skapa en länk till en bild, byta namn på den och helt slippa filtillägget. Då gick det bra, men när jag kallade den blaha.gif sket det sig. Snacka om lättlurad bildvisare…
Tack alla för förslag och så vidare. Ska testa att byta namn på några länkar nu. Inte för att jag behöver det utan för att jag helt enkelt är så dum i huvudet att jag genomför alla idéer (nästan) jag får, hur korkade de än är…
Re: Massnamnbyte
Postat: 01 maj 2009, 13:13
av Johnny Rosenberg
Testade en variant som verkar funka i praktiken förutom en liten minidetalj, som jag inte lyckas komma runt riktigt bra:
Idén var att namnge länkarna (alla finns i samma mapp) i ordning med start på ”001”, men att göra det i slumpvis ordning. Alla länkar heter, som utgångspunkt, "Länk till $GammaltNamn".
Tänkte mig då en for-loop enligt följande:
Kod: Markera allt
for a in $(ls Länk* | sort -R); do
diverse fjanterier
done
Problemet är ju att länknamnen innehåller mellanslag, så allt som händer är att jag får en massa felmeddelanden om att det inte finns någon fil som heter ”Länk”, ingen som heter ”till” och så vidare.
Hittade på nätet några lösningar som går ut på att fippla med $IFS, men det funkade inte i mitt fall. Det blev snarare värre… då såg den även bokstaven ”ä” som ett skiljetecken. Så här såg annars exemplet ut som jag försökte utgå ifrån, som jag hittade på nätet:
Kod: Markera allt
#!/bin/bash
SAVEIFS=$IFS
IFS=$(echo -en "\n\b")
for f in *
do
echo "$f"
done
IFS=$SAVEIFS
Det verkar skita sig för mig i och med att jag använder ”$(uttryck)” istället för bara ”*”.
Visst kan jag i förväg byta namn på filerna så att de saknar mellanslag innan jag kör, men nu blev jag ju nyfiken på hur man löser problemet som just kom upp, inte hur man slingrar sig förbi det…
Syftet här är ju att jag är nyfiken och vill lära mig saker, oavsett om jag omedelbart ser någon praktisk nytta med det eller ej.
Re: Massnamnbyte
Postat: 01 maj 2009, 15:23
av Konservburk
Johnny Rosenberg skrev:Visst kan jag i förväg byta namn på filerna så att de saknar mellanslag innan jag kör, men nu blev jag ju nyfiken på hur man löser problemet som just kom upp, inte hur man slingrar sig förbi det…
Ett filnamn kan innehålla precis vilka tecken som helst utom / och nolltecken. Lösningen är därför att använda något av dessa tecken som separator. Har du hela sökvägar snarare än bara filnamn så kan du av uppenbara skäl inte använda /, och då återstår endast alternativet nolltecken.
Man skulle kunna göra ungefär så här:
Kod: Markera allt
#!/bin/sh
find Länk* -maxdepth 0 -print0 |
sort -Rz |
xargs -0 sh -c '
for f
do
# diverse fjanterier
echo : "$f"
done
' :
Men då blir det en underprocess av det hela, vilket innebär att du t.ex. inte kan sätta variabler i loopen och räkna med att de finns kvar efteråt.
Om du inte har något emot bash-specifik kod så kan du ta dig runt det problemet så här:
Kod: Markera allt
#!/bin/bash
while read -d '' f
do
# diverse fjanterier
echo : "$f"
done < <(
find Länk* -maxdepth 0 -print0 |
sort -Rz
)
Re: Massnamnbyte
Postat: 01 maj 2009, 20:02
av Johnny Rosenberg
Tack för alla intressanta förslag. Har testat en av två olika metoder nu och kom fram till en annan variant, med inspiration av de förslag jag fått här och med hjälp av lite annat jag hittat på nätet.
Eftersom jag inte kom på något lättläst sätt att fixa så att det funkar med mina filer, utan att först byta namn på dem, gick jag en liten omväg genom att jag sparar delresultat i filer, vilket givetvis försämrar prestandan, men koden ser inte fullt så kryptisk ut då. Den är alltså anpassad till mina högst bristfälliga kunskaper i skalprogrammering, så att säga.
Så här ser det ut i alla fall:
Kod: Markera allt
#!/bin/sh
for a in Länk*; do
echo "$a"
done > .testfile
sort -R -o .randomfile < .testfile
count=1
while read oldname; do
newname="00"$count
length=$(($(echo $newname | wc -c)-1))
newname=$(echo $newname | cut -c$(($length-2))-$length)
mv "$oldname" "$newname"
count=$((count+1))
done < .randomfile
rm .testfile
rm .randomfile
Ser kanske lite långt ut och det tog faktiskt några sekunder att byta namn på 289 filer, men det är väl så det blir när man bygger sina experiment enbart på kod man begriper sig på, om man som jag är på nybörjarstadiet - ett stadium jag aldrig tycks ta mig ur när det gäller skalskriptprogrammering…
Re: Massnamnbyte
Postat: 01 maj 2009, 22:43
av David Andersson
Johnny Rosenberg skrev:
Kod: Markera allt
newname="00"$count
length=$(($(echo $newname | wc -c)-1))
newname=$(echo $newname | cut -c$(($length-2))-$length)
Det där är alltså för att formattera ett tal så det blir tresiffrigt med inledande nollor. Det är var printf och sprintf är till för. Tror att de tre raderna kan ersättas med
(Är ofta misstänksam mot program som använder stora tjok av kod för ganska enkla sträng-manipulationer. Det är en sjuka jag har.)
Re: Massnamnbyte
Postat: 01 maj 2009, 23:14
av bbauto
Hinner inte läsa genom alla inlägg men vill flagga för "PrefixSuffix" som finns i förråden, om inte detta redan nämnts!?

Re: Massnamnbyte
Postat: 02 maj 2009, 00:29
av Johnny Rosenberg
David Andersson skrev:Johnny Rosenberg skrev:
Kod: Markera allt
newname="00"$count
length=$(($(echo $newname | wc -c)-1))
newname=$(echo $newname | cut -c$(($length-2))-$length)
Det där är alltså för att formattera ett tal så det blir tresiffrigt med inledande nollor. Det är var printf och sprintf är till för. Tror att de tre raderna kan ersättas med
(Är ofta misstänksam mot program som använder stora tjok av kod för ganska enkla sträng-manipulationer. Det är en sjuka jag har.)
Oj, visste inte att man kunde använda printf i sh-skript! Vad bra, det är jag ju van vid från C-programmering (som jag visserligen ägnade mig åt vid slutet av 1980-talet, men lite känner jag allt igen…)
Fast syntaxen var ju inte riktigt samma som i C…
Önskar att det fanns något skalskriptspråk som såg ut exakt som ANSI-C, det hade gjort saker och ting otroligt mycket enklare än nuvarande flumspråk. I alla fall för mig, som är en gammal hund som vägrar att lära sig sitta…
Kommer ihåg när man fipplade lite i Unix, också i slutet av 1980-talet. Då var det csh och tcsh man lekte med och det var ju lite likt C, men det var ändå mycket som skiljde.
När jag läste lite C++, 1993 tror jag det var, var jag lite besviken att det ansågs dåligt att använda printf och att man skulle använda cout istället, men man vande sig vid det också, men då var man ju ung…
Ska testa lite printf nu… Några fler arv från C som kan vara värt att känna till?
Och jag gillar inte heller när enkla saker görs med till synes mycket kod. Vill ha det så smidigt som möjligt, så jag är tacksam för allt nytt som finns att lära.