2016-01-29, 21:32
  #1
Medlem
Rob.Mooneys avatar
Jag har kollat runt lite på internet men det är ingen av dom exempel som finns jag hittat som fungerar på det jag vill. Förstår heller inte strukturen på scriptet så kan inte skriva om det. Finns det någon snäll flashbackare som kan hjälpa mig? Alla exempel visar antingen hur man tar hela namnet och gör till mappar eller skapar namnet själv för att sedan flytta dit filerna.

Problemet: Jag har ca 1000 zipfiler som ligger i en mapp. Filerna har strukturen Jane Doe-Shot at the park.zip och det finns ca 200 olika namn. Alltså Josefin Doe, Bianca Doe osv osv och alla har olika titelnamn(shot at the park) Så det jag vill göra är att ta allting till vänster om bindestrecket (-) i filnamnet och skapa en mapp av. Sedan vill jag flytta all filer som har samma namn till vänster om bindestrecket in i den mappen. Vissa namn har 2 filer andra 6-7.

Kod:
Så här ser det ut nu ungefär fast runt 1000 filer
Jane Doe-Shot at the park.zip
Jane Doe-Shot at the zoo.zip
Jane Doe-Perfect Dark.zip
Jane Doe-Zombies.zip
Biance Jones-The keeper.zip
Biance Jones-The jail.zip
Biance Jones-Jailtime.zip
Biance Jones-Keeping me up.zip

Så här vill jag att det ska se ut efteråt
Kod:
Jane Doe
      -Jane Doe-Shot at the park.zip
      -Jane Doe-Shot at the zoo.zip
      -Jane Doe-Perfect Dark.zip
      -Jane Doe-Zombies.zip
Biance Jones
     -Biance Jones-The keeper.zip
     -Biance Jones-The jail.zip
     -Biance Jones-Jailtime.zip
     -Biance Jones-Keeping me up.zip


Citera
2016-01-30, 12:48
  #2
Medlem
Jag gör ofta och gärna "oneliners"/script som genererar script för den egentliga uppgiften. P.s.s kan man se/kontrollera/justera scriptet innan man släpper loss det i stor och svår-reverserad skala.

Här följer mitt förslag - De första två kommandoraderna utför inga förändringar utan låter dig bara prova/kolla att förutsättningarna är rätt:

I macen ska du alltså öppna programmet "terminalen" och förfytta dig till den katalog som du vill skapa de nya undermapparna i - Innan du klistrar in mina exempel.

Kod:
ls -1 | grep '.*\-' | cut -d"-" -f1 | sort -u | sed 's/^/mkdir "/;s/$/"/' | head
Delen före "sed" ser till att vi bara blandar in de filer vi tänkt oss, "sed" bygger sedan ett kommando och "head" begränsar testet till (max) tio rader.

Kod:
ls -1 | grep '.*\-' | cut -d"-" -f1 | sort -u | sed 's/^/"/;s/$/"/' | cat -v |fgrep M- | head
Gör nästan samma sak, men hjälper dig kolla att inga "bibloteksnamn" innehåller ÅÄÖ och sånt. Det vill vi undvika och framförallt inte ha med i skriptkommandon.
Detta kommando ska helst INTE ge några rader alls som utmatning! Kommer de något så är det alltså sådant som bör hanteras mer manuellt eller iaf fixas till innan ett skript från nästa kommando släpps loss.

Kod:
ls -1| grep '.*\-'| cut -d"-" -f1| sort -ru|awk -F"-" '{Nn=$1;gsub(" ","?",Nn);printf("mkdir \"%s\";mv %s-* %s/ \n",$1,Nn,Nn)}'
Här väljer jag att bygga de dubbla kommandona per namn med verktyget "awk" i stället för "sed". Pga att jag använder "wildcards" så vänder jag också sorteringsordningen för att undvika fel (delmängder).

Kör du det "rakt av" så kommer det alltså visa dig de ca 200 kommandorader som behövs för din uppgift.
Avslutar du med " | head " så begränsar du till färre rader - Som i ditt exempel:
Kod:
mkdir "Jane Doe";mv Jane?Doe-* Jane?Doe/
mkdir "Biance Jones";mv Biance?Jones-* Biance?Jones/
Avslutar du isället med " > kommandon.txt " så får du en textfil att inspektera/redigera. Den kör du sedan med " sh -x kommandon.txt "
Behöver man inte redigera alls så avslutar man med " | sh " för att köra direkt.

Med ditt lagom stora antal (1000 filer/200 kataloger) så skulle jag tveklöst skicka ned kommandona i en fil och titta igenom/justera för "konstiga undantag", typ:
Anna-Lena Lofgren-Lyckliga gatan.zip
Av liknande skäl skulle jag undvika att manipulera filnamnen utan bara flytta (om nu inte ditt inledande "-" bara var ett misstag).
Citera
2016-01-31, 18:41
  #3
Medlem
Rob.Mooneys avatar
Citat:
Ursprungligen postat av iconicatab
Jag gör ofta och gärna "oneliners"/script som genererar script för den egentliga uppgiften. P.s.s kan man se/kontrollera/justera scriptet innan man släpper loss det i stor och svår-reverserad skala.

Här följer mitt förslag - De första två kommandoraderna utför inga förändringar utan låter dig bara prova/kolla att förutsättningarna är rätt:

I macen ska du alltså öppna programmet "terminalen" och förfytta dig till den katalog som du vill skapa de nya undermapparna i - Innan du klistrar in mina exempel.

Kod:
ls -1 | grep '.*\-' | cut -d"-" -f1 | sort -u | sed 's/^/mkdir "/;s/$/"/' | head
Delen före "sed" ser till att vi bara blandar in de filer vi tänkt oss, "sed" bygger sedan ett kommando och "head" begränsar testet till (max) tio rader.

Kod:
ls -1 | grep '.*\-' | cut -d"-" -f1 | sort -u | sed 's/^/"/;s/$/"/' | cat -v |fgrep M- | head
Gör nästan samma sak, men hjälper dig kolla att inga "bibloteksnamn" innehåller ÅÄÖ och sånt. Det vill vi undvika och framförallt inte ha med i skriptkommandon.
Detta kommando ska helst INTE ge några rader alls som utmatning! Kommer de något så är det alltså sådant som bör hanteras mer manuellt eller iaf fixas till innan ett skript från nästa kommando släpps loss.

Kod:
ls -1| grep '.*\-'| cut -d"-" -f1| sort -ru|awk -F"-" '{Nn=$1;gsub(" ","?",Nn);printf("mkdir \"%s\";mv %s-* %s/ \n",$1,Nn,Nn)}'
Här väljer jag att bygga de dubbla kommandona per namn med verktyget "awk" i stället för "sed". Pga att jag använder "wildcards" så vänder jag också sorteringsordningen för att undvika fel (delmängder).

Kör du det "rakt av" så kommer det alltså visa dig de ca 200 kommandorader som behövs för din uppgift.
Avslutar du med " | head " så begränsar du till färre rader - Som i ditt exempel:
Kod:
mkdir "Jane Doe";mv Jane?Doe-* Jane?Doe/
mkdir "Biance Jones";mv Biance?Jones-* Biance?Jones/
Avslutar du isället med " > kommandon.txt " så får du en textfil att inspektera/redigera. Den kör du sedan med " sh -x kommandon.txt "
Behöver man inte redigera alls så avslutar man med " | sh " för att köra direkt.

Med ditt lagom stora antal (1000 filer/200 kataloger) så skulle jag tveklöst skicka ned kommandona i en fil och titta igenom/justera för "konstiga undantag", typ:
Anna-Lena Lofgren-Lyckliga gatan.zip
Av liknande skäl skulle jag undvika att manipulera filnamnen utan bara flytta (om nu inte ditt inledande "-" bara var ett misstag).


Tack som fan för att du tog dig tid att skriva ihop detta! Om du nu inte hade det färdig sedan innan, men ett lika stort tack ändå! Gick hur smidigt som helst och tog bara ett par minuter totalt från att jag började. Hade inga åäö i namnen och det inledande "-" var bara för att visa att dom var subfiler i en mapp. Använder min av programmet NameChanger för att batch-ändra namn. Återigen tack som fan!
Citera
2016-02-01, 09:55
  #4
Medlem
Citat:
Ursprungligen postat av Rob.Mooney
Tack som fan för att du tog dig tid att skriva ihop detta!
...
Använder min av programmet NameChanger för att batch-ändra namn. Återigen tack som fan!

Kul att du blev nöjd!

När man flyttar filer i ett Un*ix filsystem så är det samma operation som att byta filnamn. Du borde labba lite med din "NameChanger" och stoppa in ett eller flera / på "till-sidan".
Citera

Skapa ett konto eller logga in för att kommentera

Du måste vara medlem för att kunna kommentera

Skapa ett konto

Det är enkelt att registrera ett nytt konto

Bli medlem

Logga in

Har du redan ett konto? Logga in här

Logga in