1) Det finns kommandot
mkdir -p som skapar en mapp om den inte finns och inte störs av om den redan finns. Den kan man alltså använda före varje fil som kopieras, med målkatalogen som argument.
2) Varför inte låta find söka på filnamn också med
-iname "*.mp3" ?
3) Case-satsen söker på
*mp3*, d.v.s träffar filer med mp3 utan punkt före eller med text efter, t.ex. "This_is_not_mp3.wav". Ska det vara så?
4) Med flaggan
-r till
read så störs den inte av eventuella backslash i filnamn.
Förslag (ej testat)
Kod: Markera allt
#!/bin/bash
sourcetop="/home/mats/transmission/complete"
targettop="/media/trekstor/audio/music/zzslask"
cd "$sourcetop"
find . -type f -iname "*.mp3" | while IFS= read -r filename; do
relativedir=$(dirname "$filename")
basename=$(basename "$filename")
mkdir -p "$targettop/$relativedir"
mv "$filename" "$targettop/$relativedir/$basename"
done
5) Man kan lägga till nån av flaggorna
--no-clobber eller
--interactive till
mv om man vill vara säker på att inte skriva över filer med samma namn som kanske redan finns i målkatalogen. Om det är bra, och vilken som är bäst, beror förstås på vad det är du vill ska hända. Se även
--update.
6) Ett alternativ till mv kan vara
rsync. Då behöver man inte heller find och while, utan rsync loopar över alla filer i angivna kataloger och kan kopiera med relativa pathen intakt och kan ta bort källfilerna när den kopierat till målfilerna. Mer flaggor kan man tala om att den bara ska kopiera vissa filer. Se flaggorna --recursive --perms --times --include och --remove-source-files. (ej testat)