Byta namn på många filer utifrån första raden i varje fil

Tråden skapades och har fått 19 svar. Det senaste inlägget skrevs .
1

Jag har exporterat en databas med uppgifter från Outlook till filer i rtf-format. Vid exporten fick de namnen task0001, task 0002 osv, ett tusental filer.

I filerna är första textraden namnet på uppgiften som det såg ut i Outlook, och jag skulle vilja ta den raden för att döpa om varje fil. Har letat bland olika batch rename-program, men inte kunnat finna rätt ännu. Finns det något program för macen som kan fixa detta? Eller kan man göra detta smidigt med t ex Automator? Annars får jag väl sätta mig vid en pc-burk, vet dock inget program där heller i skrivande stund.

Inte mycket till hjälp när jag inte har tid att konkret visa hur du kan göra, men det går att lösa med AppleScript. Googla eller hoppas att någon av AppleScript-stjärnorna här på forumet kan hjälpa dig.

Jag har löst liknande problem med ett litet program som heter "A Better Finder Rename". Om du skapar en fil med alla uppgifterna (dvs. dina titlar) ordnade uppifrån och ner så kan programmet döpa om filerna enligt denna fil (välj "Rename files from list").

Listan kan du skapa med en texthanterare som klarar av att söka i många filer samtidigt, t.ex. TextWrangler.

Fast det vore ju förstås elegantare med ett Applescript...

tack för goda råd! Googlade efter applescripts, kollade in macscripter.net och scriptweb.org, men kunde inte hitta något. Tycker Applescript verkar vara ett smidigt sätt, så vore tacksam för tips på lämpligt script!

Kan tillägga att jag är switcher och har ännu inte kommit att använda AppleScripts, så det här vore en mycket bra början för att inse potentialen med scripts.

Ursprungligen av Klas Bergman:

...Kan tillägga att jag är switcher och har ännu inte kommit att använda AppleScripts, så det här vore en mycket bra början för att inse potentialen med scripts.

Du behöver inte ursäkta dig. Jag vill lära mig Applescript. Men trots att det var 20 år sedan jag switchade (från miniräknare och skrivmaskin) har jag inte lyckats avsätta den lilla tid som krävs. Jag kan tyvärr för lite för att kunna/hinna hjälpa dig med scriptandet.

Men jag framhåller åter att A Better Finder Rename är ett kanonprogram som klarar alla upptänkliga filnamnsbyten. Inte särskilt dyrt heller.

Automator är helt värdelöst i detta sammanhang, sorry. I massor med trådar har jag försökt förklara skillnaden på Automator och Applescript.

http://www.99.se/allt-om-mac/267366-hoegerklicka-foer-att-skicka-fil-per-mail.html
http://www.99.se/applescript/267294-autogenerera-kod-med-filnamn-taggar.html
http://www.99.se/apple-programvara/267061-klicka-flashknappar-med-automator.html
http://www.99.se/apple-programvara/263056-automator-klicka-laenk-med-samma-namn.html
http://www.99.se/microsoft/262193-komprimera-infogade-bilder-i-ett-officedokument.html

(Man hittar inte allting via Google liksom... )

Applescript är sättet att göra detta på. Men för att visa måste jag faktiskt skriva ett riktigt script, dvs lösa problemet åt dig. Det har jag tyvärr inte tid med. Inte gratis i alla fall.

Tycker du dig inte ha tid att lära dig Applescript får du betala någon som kan.

Vill du lära dig Applescript så finns det massor med siter och exempel. Allt om Applescript finns även i Applescript Language guide som innehåller många exempel.

Jag har en länk på första sidan på min site om Applescript:
Applescript-tips från Intelligent Mammals AB - Hem

Vad du behöver göra är ungefär:

Greppa en lista på varje fil i mappen.
Starta en loop genom alla saker i denna lista.
Tag första filen, läs in den tills dess du hittar ett returtecken.
Tag den första raden, döp om filen med det.
Avsluta loopen.

Klart!

M. Sundbom. Du kanske inte läste frågan ordentligt? Han har inte EN fil som innehåller alla filnamn, som A better Finder rename kan jobba med. Han har 1000 RTF-filer, inuti var och en av dessa filer står det önskade filnamnet på första raden. Det kan inte A better Finder rename fixa, så kanske du inte skall rekommendera det som en lösning?

Applescript är enda lösningen i det här fallet.

(Eller alla möjliga egenutvecklade programvaror eller script-program som kan läsa filer och döpa om filer, tex PHP, Lasso eller C++ osv...)

Jo, jag tror jag visst uppfattat problemet rätt. I mitt tidigare inlägg skriver jag väl att man först måste göra en lista av alla namnen innan "a better finder rename" kan ersätta filnamnen.

Finns säkert många sätt att göra listan, men jag som inte är någon vidare programmerare använder gärna GUI-verktyg och med TextWrangler (gratis) tar det bara någon minut (öppna alla filerna, sök allt efter och inkl. första returtecken i alla filerna samtidigt och ersätt med inget (kryssa för Multi-file och välj sedan att spara automatiskt). Edit/Insert/File contents... och välj då att att lägga till innehållet i de 999 filerna i den första filen). Typ.

Men att det är i RTF kanske krånglar till det för TextWrangler eftersom det då finns en del skräptext innan själva texten. Men även det borde gå att grepa bort med lite finurlighet.q

Han ville inte vad jag kan se öppna 1000 filer och radera första raden, vilket är vad din "lösning" gör. Med Textwrangler kan du heller inte få ut en lista på filnamn (första raden från 1000 filer), utan att använda dig av just, (*lägg in trumvirvel här*): Applescript! Textwranglers sök/ersätt som funkar på flera filer har alltså inte förmågan att sammanställa information från flera filer till en fil.

Inte för att vara tyken, men testar du lösningarna du föreslår innan du föreslår dem?

Du har även rätt i att RTF inte är något som Textwrangler kan hantera väl. Men med just Applescript så behöver man förmodligen inte andra program, Applescript kan läsa filen själv. Går inte det kan man instruera ett program som kan hantera RTF + har stöd för Applescript (Textredigeraren, Microsoft Word, Appleworks tex), att göra det.

Förresten jag har i en annan tråd visat vad skillnaden är på RTF och ren text. Inlägg 2 i denna tråd:

http://www.99.se/apple-programvara/245735-hur-importera-textfil-i-adressboken.html

Ursprungligen av Taz_1999:

Han ville inte vad jag kan se öppna 1000 filer och radera första raden, vilket är vad din "lösning" gör. Med Textwrangler kan du heller inte få ut en lista på filnamn (första raden från 1000 filer), utan att använda dig av just, (*lägg in trumvirvel här*): Applescript!
...

Okej, med risk för att bli petig och off-topic, vill jag först säga att jag inte säger mot dig angående att Applescript skulle lösa detta mycket elegantare, vilket jag redan deklarerat i denna tråd. Men eftersom både jag och trådskaparen (som kanske har bråttom) är nybörjare på Applescript föreslog jag en alternativ lösning som jag brukar använda för exakt samma problem. Proceduren jag beskrev är ett snabbt sätt att att skapa listan på åtrådda filnamn som "A Better Finder Rename" använder för att byta namn på de tusen filerna. Men visst, om man hade ett fungerande Applescript vore det ju smidigare, inget snack om saken.

Ursprungligen av Taz_1999:

... Textwranglers sök/ersätt som funkar på flera filer har alltså inte förmågan att sammanställa information från flera filer till en fil.

Inte för att vara tyken, men testar du lösningarna du föreslår innan du föreslår dem?
...

Helt riktigt att TextWranglers sök/ersätt inte kan sammanfoga filer men väl menyvalet "Insert/File content..." (som jag skrev i inlägget ovan; vem av oss läser ordentligast nu va? )

Och ja, jag brukar testa mina lösningar om jag har möjlighet. Som i detta fall. Jag får regelbundet hundratals xml-filer via mail och vill döpa om alla filer efter en specifik sträng som ligger inne i xml-koden. Visst har jag övervägt Applescript för detta men det har liksom inte blivit av (men jag har faktiskt ett litet script som sköter själva operationerna inne i TextWrangler).

Det är väl bra att det finns flera olika sätt att lösa ett problem på, även sådana som inte inbegriper (*lägg in ouvertyren till R. Strauss Also Sprach Zarathustra här*) Applescript?

På mac är detta rätt enkelt att fixa även med bash, tack vare det trevliga kommandot textutil.

Förberedelse för mitt exempel är att jag befinner mej i en katalog x som innehåller 2 underkataloger in och ut. Filerna med namn som taskx.rtf har jag i katalogen in och för att undvika missöden så kopierar jag filerna från in till ut och namnger dem samtidigt enligt första raden i varje fil. Efter körning har jag kvar mina original filer i katalogen in och dom som fått nya namn i kkatalogen ut.

for file in `ls in/*.rtf`; do cp $file ut/"`textutil -convert txt -stdout $file | head -1`.rtf"; done;

Hej och tack för all respons! Tack Taz för trådarna om Automator och Applescript, har fått en bättre bild av Automators begränsningar och Applescripts möjligheter.

Ska först ge mig på textutil (tack Air!), verkar vara en smidig operation och ett litet men viktigt steg in i scriptvärlden

Ursprungligen av Klas Bergman:

Ska först ge mig på textutil (tack Air!), verkar vara en smidig operation och ett litet men viktigt steg in i scriptvärlden

Textutil är alltså bara den del som konverterade rtf till text på ett enkelt sätt för att jag skulle få ut filnamnet. Kommandot från mitt tidigare inlägg körs allts inne i en Terminal (terminal.app) efter att du befinner dej i rätt katalog.

  • Medlem
  • Norrköping
  • 2009-08-05 20:20

Det finns ett annat alternativ men det kostar pengar. QuicKeys (Startly - QuicKeys4 for Mac OS X).

Med QuicKeys kan man skapa ett makro genom att spela in en serie med kommandon, inkl. musrörelser och klickningar, och sedan spela upp makrot valfritt antal gånger.
I ett sånt här fall startar man inspelning, öppnar översta Taskxxfilen (Finder i listvy), markerar första raden i filen, kopiera, välj spara som till annan katalog, klistra in urklippet som nytt filnamn, stänger filen, flyttar översta Taskxxfilen till Trash stoppar inspelningen. Kolla hur många taskfiler som återstår repetera makron samma antal gånger, gå och fika under tiden.

Jag har själv använt QuicKeys för att bl.a. convertera ett antal tusen tiff-filer till pdf:er. Spelade in och sparade makrot och startade det straxt innan jag gick hem från jobbet. På morgonen hade jag en katalog med färska pdf:er. Mycket smidigt.

En rapport om hur det funkat hittills: textutil var mycket smidigt att köra. Vips så var ett par tusen filer omdöpta. Sedan körde jag ett rename-program, R-name, som tog bort de sju första tecknen i varje filnamn ("Ämne: ") som hängt med från Outlook. Klart!

Men: detta funkade med underkategorier till mina Outlook Tasks, men huvudkategorin/mappen, med ett par tusen items stötte på patrull:

*textutil gillar inte att döpa filer där "/" finns i filnamnet, vilket var fallet för ett par hundra items (ex där svenska datum var med i titeln). Dessa kommer upp som en lista med felmeddelanden i Terminalfönstret. Förstår att detta har att göra med att / tolkas som en mappnivå i OS X. Kanske finns det en workaround med Text Wrangler eller liknande som föreslagits, eller om det finns parametrar att ställa in för output i textutil?

*Det fanns också ett femtiotal items i min Outlook-databas med samma titel. Detta gillades naturligtvis inte heller av textutil, varför dubletter inte processades. Tyvärr dyker inte dessa upp i listan med felmeddelanden, så här är jag lost om det går att automatisera. Kanske även här något i stil med Text Wrangler kan gå igenom filerna och visa på dubbletter av första raden? Eller smidigare: om textutil eller något program (som A Better Finder Rename ovan) kan lägga till nummer till dubbletter, figur1, figur2 etc.

PS. En liten hint om varför jag håller på med detta, förutom att det är intressant att lära sig mer om möjligheterna med Macen och batch-funktioner: som jag skrev är jag switcher, och håller på att migrera en databas från Outlook på pcn till Evernote på macen. Så när filerna väl har fått sina nya namn så åker de vidare in i Evernote.

Ursprungligen av Klas Bergman:

...text...

För att hantera mera avancerade saker som att byta ut filnamn samt kolla om en fil redan existerar är det enklare att använda sej av en fil för att spara shellscriptet istället för att köra på en rad som i mitt tidigare exempel.

Jag skrev ett enkelt shellscript som borde lösa en större mängd av dina filer, den gör samma som tidigare, men plockar även bort en del icke godkända tecken och ditt prefix "Ämne: ". Om en fil med samma namn redan existerar får den nya filen istället samma namn men med suffixet "-1" (eller 2, 3, 4, ..n)

Nedanstående shellscript kan du spara i en fil som du namnger t.ex. "runme.sh" och sparar i katalogen där du tidigare körde kommandot. Filen körs från terminalen med kommandot "sh runme.sh".

#!/bin/sh
#
# Repetera för varje fil in/*.rtf
for file in `ls in/*.rtf`
do
  # Plocka ut första raden ur filen.
  step1=`textutil -convert txt -stdout $file | head -1`;

  # Plocka bort prefixet "Ämne: "
  step2=`echo $step1 | sed "s/^Ämne: //g"`;

  # Plocka bort \ samt /
  step3=`echo $step2 | sed "s/\\\\\\//g;s/\///g;"`;

  # Kontrollera om det nya filnamnet redan finns och generera ett unikt filnamn. 
  newfile="$step3";
  cnt="0";
  while [ -f "ut/$newfile.rtf" ]
  do
    cnt=$[$cnt+1];
    newfile="$step3-$cnt";
  done

  # Kopiera filen till ut katalogen.
  echo "Kopierar '$file' till 'ut/$newfile.rtf'";
  cp "$file" "ut/$newfile.rtf"
done
Ursprungligen av air:

För att hantera mera avancerade saker som att byta ut filnamn samt kolla om en fil redan existerar är det enklare att använda sej av en fil för att spara shellscriptet istället för att köra på en rad som i mitt tidigare exempel.

Jag skrev ett enkelt shellscript som borde lösa en större mängd av dina filer, den gör samma som tidigare, men plockar även bort en del icke godkända tecken och ditt prefix "Ämne: ". Om en fil med samma namn redan existerar får den nya filen istället samma namn men med suffixet "-1" (eller 2, 3, 4, ..n)

Nedanstående shellscript kan du spara i en fil som du namnger t.ex. "runme.sh" och sparar i katalogen där du tidigare körde kommandot. Filen körs från terminalen med kommandot "sh runme.sh".

Vad duktig du verkar vara!
Vill gärna bli bättre på shellscript och hur rättigheter och sånt funkar.

Var börjar man?

Ursprungligen av air:

Nedanstående shellscript ...

Snyggt!

Ursprungligen av air:

För att hantera mera avancerade saker som att byta ut filnamn samt kolla om en fil redan existerar är det enklare att använda sej av en fil för att spara shellscriptet istället för att köra på en rad som i mitt tidigare exempel.

Jag skrev ett enkelt shellscript som borde lösa en större mängd av dina filer, den gör samma som tidigare, men plockar även bort en del icke godkända tecken och ditt prefix "Ämne: ". Om en fil med samma namn redan existerar får den nya filen istället samma namn men med suffixet "-1" (eller 2, 3, 4, ..n)

Nedanstående shellscript kan du spara i en fil som du namnger t.ex. "runme.sh" och sparar i katalogen där du tidigare körde kommandot. Filen körs från terminalen med kommandot "sh runme.sh".

...kod...

Hemskt tacksam, Air! För ett par dagar sedan var jag total novis på scripts, och nu har jag fått en grym introduktion som dessutom sparat mig *en hel del* av monotont arbete, kudos

Allt fungerar helt som det ska, körde hela scriptet direkt i Terminal och det går igenom hela mappen, alla namn blir precis som önskat. Storslaget!

Den lilla tweaken som skulle göra det fulländat är: om "/" kan bytas till "/ ", dvs med space efter, det verkar gå igenom. Alltså byta ut istället för att ta bort. Som det är nu blir ord separerade med / sammansatta, ex korv/låda blir korvlåda. (\ behöver inte vara med i scriptet, då det inte finns i någon titel).

Detta skulle vara pricken över i, även om jag redan är helnöjd med att ha fått en sån flygande start

Ursprungligen av Klas Bergman:

...Den lilla tweaken som skulle göra det fulländat är: om "/" kan bytas till "/ ", dvs med space efter, det verkar gå igenom. Alltså byta ut istället för att ta bort. Som det är nu blir ord separerade med / sammansatta, ex korv/låda blir korvlåda. (\ behöver inte vara med i scriptet, då det inte finns i någon titel)....

Kul att det uppskattas

Jag kollade och det verkar som att Finder visar tecknet / om man i bash använder :. För att få behålla / så byter du således ut raden som börjar med "step3" till:

# Byt ut \ till : som i finder visas som \
step3=`echo $step2 | sed "s/\//\:/g;"`;
1
Bevaka tråden