Premiär! Fyndchans i SweClockers Månadens Drop

Bash script för att ta bort prefix från filnamn.

Permalänk

Bash script för att ta bort prefix från filnamn.

Ok jag är ganska nybörjare på bash och undrar hur jag skulle kunna skriva ett script som tar bort prefix från filer. Jag använder mac os x så t.ex. rename finns inte men mv finns.

Jag hade det problemet igår och kunde inte komma på hur jag skulle göra eller få rätt på det så till slut så skrev jag ett phpscript eftersom jag hade bråttom och hade tonvis med filer att döpa om men jag skulle behöva lära mig hur jag gör ett shell script som gör samma sak som följande.

foreach (scandir('./images') as $file){ if(preg_match('/^\\[IMG\\]/', $file)) rename("./images/".$file, "./images/".str_replace('[IMG]','',$file)); }

Ska bara vara enkelbackslash men annars så syns de inte i forumet.

Var inte säker på om detta gick under Programmering och digitalt skapande eller Linux/Unix men eftersom att det handlade om bash shell scripting så tänktet jag att det skulle gå här, om jag har lagt tråden fel så kanske någon moderator kan vara snäll och flytta den.

Visa signatur

[i7 2600k @ 5GHz| NH-D14, fläktar utbyta mot ljudlösa 120mm SySS 800| Asus P8P67| HD6870 DirectCU| Corsair 4x8GB (32GB) 1600MHz DDR3| Moddat Corsair 550VX | Mac Pro / G5 Chassi| 2x120GB raid0 Intel 520 sys+ 2x3TB slask & home (riktig lagring på 12TB ZRAID NAS som även home backuppas/rsyncas till) ] - Helt ljudlös om man inte lägger örat intill chassit
[ MacBook Pro Retina 13 | 16GB ram | 256GB PCIe SSD | OS X(main), Arch ]

Permalänk
Medlem

Är prefixet alltid samma?

I så fall kan du göra såhär:
for i in *; do mv $i `echo $i | sed 's/DITT_PREFIX//'` ; done

Det skriver du direkt i terminalen i katalogen med filerna i fråga.

Visa signatur

iMac 27" | Mid 2010 | Core i7 2.93Ghz | 20 GB | HD5850 M | Samsung 840 500 GB | 4 TB WD
MacBook Air 11" | Mid 2012 | Core i7 2.0 Ghz | 8 GB | 256 GB SSD
Citera gärna om du svarar på mina inlägg, så hittar jag tillbaka igen! :)

Permalänk

Testade "for i in *; do mv $i `echo $i | sed 's/\[IMG\]//'` ; done" och det funkade bra.

Såhär har jag förstått koden

// Går igenom alla filer filer i mappen (därav *) for i in * // Använder mv för att döpa om och sed för att byta ut \[IMG\] mot ingetting (därav //). do mv $i `echo $i | sed 's/\[IMG\]//'` //Färdig done

Har jag förstått koden rätt? Annars rätta mig, lär jag mig aldrig så kommer jag aldrig klara något själv.

Visa signatur

[i7 2600k @ 5GHz| NH-D14, fläktar utbyta mot ljudlösa 120mm SySS 800| Asus P8P67| HD6870 DirectCU| Corsair 4x8GB (32GB) 1600MHz DDR3| Moddat Corsair 550VX | Mac Pro / G5 Chassi| 2x120GB raid0 Intel 520 sys+ 2x3TB slask & home (riktig lagring på 12TB ZRAID NAS som även home backuppas/rsyncas till) ] - Helt ljudlös om man inte lägger örat intill chassit
[ MacBook Pro Retina 13 | 16GB ram | 256GB PCIe SSD | OS X(main), Arch ]

Permalänk
Medlem
Citat:

Ursprungligen inskrivet av -=|ZetaXtreme|=-
Testade "for i in *; do mv $i `echo $i | sed 's/\[IMG\]//'` ; done" och det funkade bra.

Såhär har jag förstått koden

// Går igenom alla filer filer i mappen (därav *) for i in * // Använder mv för att döpa om och sed för att byta ut \[IMG\] mot ingetting (därav //). do mv $i `echo $i | sed 's/\[IMG\]//'` //Färdig done

Har jag förstått koden rätt? Annars rätta mig, lär jag mig aldrig så kommer jag aldrig klara något själv.

Japp, precis. Detta kan lösas på flera sätt, men jag tycker att sed är ganska enkelt och behändigt. Till exempel så kan du använda "cut" för att sätta en delimiter för att sedan skriva ut andra kolumnen:

echo "[IMG]eejejee" | cut -d] -f2 eejejee

cut kan vara smidigt om du har många filnamn som alla har slumpmässiga prefix men som skiljer prefixet från ordet i fråga med t.ex. ett bindesträck eller dylikt.

Pipe (|) används för att skicka vidare output från echo $i till sed som byter ut [IMG] mot ingenting precis som du skriver. Backtick ` som jag kapslade med (`echo $i | sed 's/\[IMG\]//'`) betyder att Bash exekverar denna delen som ett kommando och sätter resultatet där. I detta fallet innehållet i $i utan [IMG].

För att skriva det i ett skript så ser det ut så här:

#!/bin/env bash # En kommentar i bash-skript görs med brädgård. for i in * ; do mv $i `echo $i | sed 's/\[IMG\]//'` done

Visa signatur

iMac 27" | Mid 2010 | Core i7 2.93Ghz | 20 GB | HD5850 M | Samsung 840 500 GB | 4 TB WD
MacBook Air 11" | Mid 2012 | Core i7 2.0 Ghz | 8 GB | 256 GB SSD
Citera gärna om du svarar på mina inlägg, så hittar jag tillbaka igen! :)

Permalänk

Tack så mycket för den bra förklaringen, uppskattar det.

Visa signatur

[i7 2600k @ 5GHz| NH-D14, fläktar utbyta mot ljudlösa 120mm SySS 800| Asus P8P67| HD6870 DirectCU| Corsair 4x8GB (32GB) 1600MHz DDR3| Moddat Corsair 550VX | Mac Pro / G5 Chassi| 2x120GB raid0 Intel 520 sys+ 2x3TB slask & home (riktig lagring på 12TB ZRAID NAS som även home backuppas/rsyncas till) ] - Helt ljudlös om man inte lägger örat intill chassit
[ MacBook Pro Retina 13 | 16GB ram | 256GB PCIe SSD | OS X(main), Arch ]