Script för att kopiera filer med olika ändelser till dir
-
- Inlägg: 150
- Blev medlem: 05 okt 2007, 16:51
- OS: Xubuntu
- Utgåva: 20.04 Focal Fossa LTS
- Ort: Malmö
Script för att kopiera filer med olika ändelser till dir
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.
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.
- Osprey
- Inlägg: 6310
- Blev medlem: 06 apr 2008, 00:09
- OS: Ubuntu
- Ort: Göteborg/Mölndal/Falkenberg
- Kontakt:
Re: Script för att kopiera filer med olika ändelser till dir
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:...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:...så kan du loopa den sedan och göra vad du vill:...och sedan är det bara att bygga på resten...... 
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'
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')
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

Agera genom att ta och behålla initiativet, ta de risker detta kräver...
http://www.enargo.com/it/
OpenVMS Shark - i Linux finns inte SYS$CMKRNL...
http://www.enargo.com/it/
OpenVMS Shark - i Linux finns inte SYS$CMKRNL...
-
- Inlägg: 150
- Blev medlem: 05 okt 2007, 16:51
- OS: Xubuntu
- Utgåva: 20.04 Focal Fossa LTS
- Ort: Malmö
Re: Script för att kopiera filer med olika ändelser till dir
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?
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?
-
- Inlägg: 150
- Blev medlem: 05 okt 2007, 16:51
- OS: Xubuntu
- Utgåva: 20.04 Focal Fossa LTS
- Ort: Malmö
Re: Script för att kopiera filer med olika ändelser till dir
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
Tack igen
- Osprey
- Inlägg: 6310
- Blev medlem: 06 apr 2008, 00:09
- OS: Ubuntu
- Ort: Göteborg/Mölndal/Falkenberg
- Kontakt:
Re: Script för att kopiera filer med olika ändelser till dir
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...

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...
Agera genom att ta och behålla initiativet, ta de risker detta kräver...
http://www.enargo.com/it/
OpenVMS Shark - i Linux finns inte SYS$CMKRNL...
http://www.enargo.com/it/
OpenVMS Shark - i Linux finns inte SYS$CMKRNL...
-
- Inlägg: 150
- Blev medlem: 05 okt 2007, 16:51
- OS: Xubuntu
- Utgåva: 20.04 Focal Fossa LTS
- Ort: Malmö
Re: Script för att kopiera filer med olika ändelser till dir
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.
- Osprey
- Inlägg: 6310
- Blev medlem: 06 apr 2008, 00:09
- OS: Ubuntu
- Ort: Göteborg/Mölndal/Falkenberg
- Kontakt:
Re: Script för att kopiera filer med olika ändelser till dir
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:...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å)
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
(notera att "sed:en" i slutet av find-kommandot är borttagen nu också)
Agera genom att ta och behålla initiativet, ta de risker detta kräver...
http://www.enargo.com/it/
OpenVMS Shark - i Linux finns inte SYS$CMKRNL...
http://www.enargo.com/it/
OpenVMS Shark - i Linux finns inte SYS$CMKRNL...