Moodle-palautusten käsittelyn automatisointia
448 518 613
Nämä ohjeet on tehty käytettäväksi Linux-koneessa. Ne ovat sovellettavissa myös Windows-koneessa, jossa on otettu käyttöön Windows Subsystem for Linux (WSL).
Tässä esimerkissä Moodlessa opiskelijat on jaettu ryhmiin A01—A12 ja B01—B12. Palautukset tehty ryhmissä, jolloin yhden ryhmän jäsenen tallettaessa tiedoston, se tulee näkyviin kaikkien ryhmän jäsenten palautuksena.
Palautettavien tiedostojen nimeyksestä on annettu ohje, jonka mukaan nimessä pitäisi olla ryhmän tunnus, ryhmän jäsenten sukunimet ja palautuksen aihe. Valitettavasti tästä ohjeesta pidetään kiinni sangen vaihtelevasti, ja usein arviointivaiheessa kuluu turhaan paljon aikaa sen selvittelyyn, että mikä tiedosto kuuluu millekin ryhmälle tai ketä ryhmään kuuluu.
Alla oleva bash-skripti nimeää Moodlesta ladatut tiedostot ryhmätunnuksen ja ryhmän jäsenten sukunimien mukaan. Skriptin raakaversio on tehty Chat GPT:llä, minkä jälkeen se on muokattu toimivaksi käsin.
Ohjelma kopioi ja nimeää vain yhden tiedoston kustakin ryhmäkohtaisesta kansiosta. Jos palautettuja tiedostoja on useampia, ne jäävät tätä yhtä lukuunottamatta kopioimatta ja nimeämättä!
#!/bin/bash # Create an array to hold the unique group names declare -A groups # Iterate over the subdirectories starting with A01 for dir in A01* A02* A03* A04* A05* A06* A07* A08* A09* A10* A11* A12* B01* B02* B03* B04* B05* B06* B07* B08* B09* B10* B11* B12*; do # Extract the group name from the subdirectory name group=${dir%%-*} # Add the group name to the array if it doesn't exist if [[ ! ${groups[$group]+_} ]]; then groups[$group]=1 # Collect family names from subdirectory names for the group family_names=() subdirectories=( "$group"* ) # Get an array of all subdirectories for the group for subdir in "${subdirectories[@]}"; do name_with_number_text="${subdir#*-}" # Extract the part after the hyphen family_name="${name_with_number_text#* }" # Extract the family name (after the space) family_name="${family_name%%_*}" # Remove anything after the first underscore family_names+=("$family_name") # Add the family name to the array done # Rename the file in the group subdirectory using the group designation and family names file=$(find "$dir" -type f -printf '%f\n' | head -n 1) extension="${file##*.}" new_file="${group}-${family_names[*]}.$extension" # Remove the subfolder name from the resulting file name new_file="${new_file#*-}" # Replace spaces with underscores new_file="${new_file// /_}" # Add group name to the file name new_file="${group}_${new_file}" # Remove the trailing "/*" from the file path file="${file%/*}" file="$subdir/$file" # Print the command to rename the file mv "$file" "$new_file" fi done