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.

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.

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.

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

Permalänk

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