Sida 1 av 1
Script för att kopiera filer med olika ändelser till dir
Postat: 21 mar 2014, 11:45
av martin77
Hej
Jag skulle behöva lite hjälp med själva strukturen på ett script. Jag är inte så insatt i scripts men försöker lära mig.
Jag vill sortera mina filer i Nedladdningsbiblioteket efter ändelser och sedan kopiera dem till olika dir utifrån ändelsen. Grejen är att scriptet måste gå ner i olika subdir för att kolla ändelserna och sen kopiera hela subdiret till rätt dir.
Om någon har ett sånt script som jag kunde kolla på så vore tacksam. Har googlat lite men det är inte så lätt att hitta.
Re: Script för att kopiera filer med olika ändelser till dir
Postat: 21 mar 2014, 13:32
av Osprey
Strukturen på ett script kan variera ganska mycket beroende på vad det ska göra, men generellt så ska första raden vara "
#! /bin/bash" och sedan så kommer alla funktioner om man nu har några och sist huvudprogrammet.
I just det här fallet kan du också t.ex ha god nytta av:
Kod: Markera allt
find . -maxdepth 2 -iname \*.$EXTENSION -exec dirname {} \; | sort -u | sed 's/ /\\ /g'
...där du kan sätta "EXTENSION" till den ändelse du vill kolla först som t.ex "flv", eller också ersätta "$EXTENSION" med ändelsen som text direkt, beroende på vilket du vill...
Om du kör det som t.ex "
find . -maxdepth 2 -iname \*.flv -exec dirname {} \; | sort -u | sed 's/ /\\ /g'", så får du ut en lista på alla subdir som innehåller filer som har ".flv" i namnet, plus en punkt om det finns några direkt i det directoryt där du står...
Om du inte vill ta med filer som ligger just där du står så kör du istället "
find . -mindepth 2 -maxdepth 2 -iname \*.flv -exec dirname {} \; | sort -u | sed 's/ /\\ /g'"
Och om du gör en tilldelning av det till en variabel med:
Kod: Markera allt
FLVDIRS=$(find . -mindepth 2 -maxdepth 2 -iname \*.flv -exec dirname {} \; | sort -u | sed 's/ /\\ /g')
...så kan du loopa den sedan och göra vad du vill:
Kod: Markera allt
#! /bin/bash
FLVDIRS=$(find . -mindepth 2 -maxdepth 2 -iname \*.flv -exec dirname {} \; | sort -u | sed 's/ /\\ /g')
for DIR in "$FLVDIRS"; do
mv $DIR <somewhere>
done
...och sedan är det bara att bygga på resten......

Re: Script för att kopiera filer med olika ändelser till dir
Postat: 21 mar 2014, 14:40
av martin77
Oj! Tack. Det var avancerat.
Jag fattar find-delen, den letar igenom diret efter .flac (i det här fallet) sen skickar find det vidare till sort som sorterar filerna och flaggan -u antar jag gör att sort endast skriver ut raden en gång om det är multipla filer med samma namn.
Men sed fattar jag inte. Jag vet att det används för att leta upp och ersätta text (bl.a) men vad gör det i det här specifika fallet?
Re: Script för att kopiera filer med olika ändelser till dir
Postat: 21 mar 2014, 14:57
av martin77
Coolt. Jag testade på några .txt-filer som jag gjorde och det fungerade bra. Tack så mycket, ska klura lite på hur jag ska lägga upp scriptet så att det gör allt som jag vill.
Tack igen
Re: Script för att kopiera filer med olika ändelser till dir
Postat: 21 mar 2014, 15:06
av Osprey
Jo en av finesserna med Linux (och Unix) är ju att det går att göra väldigt kraftfulla kommandon, som utför precis exakt det man vill...
Det som den sista biten av kommandot (den biten efter "sort") gör är att den ersätter mellanslag med "\ " dvs. ett mellanslag med en backslash innan. Och meningen med det är att om det finns namn som innehåller ett mellanslag, så behövs det för att de kommandon man gör sedan ska förstå att mellanslaget är en del av namnet...
Re: Script för att kopiera filer med olika ändelser till dir
Postat: 21 mar 2014, 15:39
av martin77
Hmm... testade det i "skarpt läge" men det vill inte fungera. Antagligen handlar det just om en "\" eller flera som ligger fel. Här är ett utsnitt av debug-meddelandena:
Kod: Markera allt
[martin@Alcor Musik]$bash -x FLAC_sorteraren.sh
++ find . -maxdepth 4 -iname '*.flac' -exec dirname '{}' ';'
++ sort -u
++ sed 's/ /\\ /g'
+ FLACDIR='.
./8-Bit\ Operators\ -\ The\ Music\ of\ Kraftwerk
./Agnes\ Obel\ -\ 2013\ -\ Aventine\ [FLAC]
./Agnes\ Obel\ -\ Philharmonics\ -\ Deluxe\ Edition\ 2011\ FLAC/Agnes\ Obel\ -\ Philharmonics\ -\ bonus\ disc\ FLAC
./Agnes\ Obel\ -\ Philharmonics\ -\ Deluxe\ Edition\ 2011\ FLAC/Agnes\ Obel\ -\ Philharmonics\ FLAC
./Albinoni\ -\ Complete\ Concertos\ (2CD)/cd1
./Albinoni\ -\ Complete\ Concertos\ (2CD)/cd2
...
...
...
...
...
BiRd-BrAiNs './tUnE-yArDs\' '-\' 'W\' 'H\' 'O\' 'K\' 'I\' 'L\' 'L\' '(FLAC)' ./Unknown/Unknown './Uriah\' 'Heep/1993\' '-\' 'The\' 'Very\' 'Best\' 'of\' '(FLAC)' './Ute\' 'Lemper/All\' 'that\' 'jazz\' 'The\' 'best\' of './Ute\' 'Sing\' 'Kurt\' 'Weill\' 'Vol\' 2 './Various\' 'Artists/Cornelis\' 'Vreeswijk\' 'Bästa\' '[2_2\' 'CD]' './Various\' 'Artists/The\' 'Best\' 'Prog\' 'Rock\' 'Album\' 'In\' 'The\' 'World...Ever!\' '[Disc\' '1]' './Various\' 'Artists/The\' 'Best\' 'Prog\' 'Rock\' 'Album\' 'In\' 'The\' 'World...Ever!\' '[Disc\' '2]' './Various\' 'Artists/The\' 'Best\' 'Prog\' 'Rock\' 'Album\' 'In\' 'The\' 'World...Ever!\' '[Disc\' '3]' './Watergate\' '05\' '(2010)-Ellen\' Allien /home/martin/Musik/FLAC/
mv: ogiltig flagga -- "\"
Försök med ”mv --help” för mer information.
Re: Script för att kopiera filer med olika ändelser till dir
Postat: 21 mar 2014, 16:12
av Osprey
För just det här så kan det kanske funka om du lägger till en "
| sed 's/-/\\-/g'" på slutet, men vill du ha en lite säkrare lösning så gör du som:
Kod: Markera allt
#! /bin/bash
FLVDIRS=$(find . -mindepth 2 -maxdepth 2 -iname \*.flv -exec dirname {} \; | sort -u)
for DIR in "$FLVDIRS"; do
QDIR=$(printf "%q" $DIR)
mv $QDIR <somewhere>
done
...tyvärr går det inte att "pipe:a" in i printf.....
(notera att "sed:en" i slutet av find-kommandot är borttagen nu också)