### L'appel de logiciels

Il peut être appelé depuis Bash comme suit:

```{.bash linenos="true" breaklines="true" tabsize="2" fontsize="\small" bgcolor="turquoisefonce!10!white"}
mon_code="Dir['*'].each { |p| File.rename(p, p.downcase) }"
ruby -e ${mon_code}
```

- Le script Bash écrit la chaîne de caractère qui contient le code Ruby dans la variable `mon_code`.
- Ensuite, il envoie le contenu de `mon_code` à l'interpréteur du langage Ruby

### La manipulation de fichiers

 comme suit:

```{.bash linenos="true" breaklines="true" tabsize="2" fontsize="\small" bgcolor="turquoisefonce!10!white"}
pdftk \
page_couverture.pdf \
table_matieres.pdf \ 
chapitre_1.pdf \
chapitre_2.pdf \ 
conclusion.pdf \
cat output mon_ebook.pdf
```

- On lance le logiciel `pdftk`
- Ensuite, on énumère dans l'ordre tous les fichiers à concaténer
- On spécifie l'action. Le mot `cat` est souvent utilisé pour la concaténation.
- On spécifie le fichier de sortie après `output`. Ici, c'est `mon_ebook.pdf`

Petite note: la barre oblique `\` c'est pour couper les lignes pour les rendre plus faciles à lire !

### Les tubes

Par exemple, si je veux trouver tous les livres sur le logiciel Spark qui se trouvent dans ma bibliothèque Nextcloud, la commande Bash correspondante prend la forme suivante:

```{.bash linenos="true" breaklines="true" tabsize="2" fontsize="\small" bgcolor="turquoisefonce!10!white"}
find "nextcloud/Livres" -type f | \
grep -i "voyage|travel"
```

- Le premier argument de find est le répertoire de recherche, ici c'est `nextcloud/Livres/Technical`.
- Le premier paramètre est `type`, avec comme valeur `f`, pour rechercher uniquement les fichiers.
- Ensuite, il y a un tube vers la commande `grep`
- `grep` a un paramètre, `-i` qui spécifie que ce qui suit n'est pas sensible à la casse (an anglais *case insentitive*)
- Enfin, il y a l'expression de recherche `voyage|travel` qui va retourner tous les noms de fichiers qui contiennent soit le mot `voyage`, soit le mot `travel`

### cron sur Linux et macOS

Il est aussi possible de mettre le script à exécuter dans un des 4 répertoires suivants

```{.bash linenos="true" breaklines="true" tabsize="2" fontsize="\small" bgcolor="turquoisefonce!10!white"}
/etc/cron.daily
/etc/cron.hourly
/etc/cron.monthly
/etc/cron.weekly
```

Le comportement par défaut est d'exécuter le script à chaque minute. Ensuite, si on veut réduire la fréquence, on spécifie à quel moment exécuter le script.

### Planificateur de tâches sur Windows

Une fois la commande exécutée, nous obtenons cette réponse:

```{.powershell linenos="true" breaklines="true" tabsize="2" fontsize="\small" bgcolor="turquoisefonce!10!white"}
TaskPath                                       TaskName                          State
--------                                       --------                          -----
\                                              cocktail-aleatoire                Ready
```

### Tester avant d'exécuter

```{.bash linenos="true" breaklines="true" tabsize="2" fontsize="\small" bgcolor="turquoisefonce!10!white"}
rsync -av \
--dry-run \
--progress \
--delete \
/source/mondossier \
/destination/mondossier
```

### Fin de l'exécution

Lorsque la commande est terminée, ça va produire un sommaire comme suit:

```{.bash linenos="true" breaklines="true" tabsize="2" fontsize="\small" bgcolor="turquoisefonce!10!white"}
sent 391,414,597 bytes  received 16,270 bytes  46,050,690.24 bytes/sec
total size is 391,253,238  speedup is 1.00
```

Afin de valider que la sauvegarde est bien réussie, il suffit d'exécuter à nouveau la commande. Si aucun fichier n'est synchronisé, alors c'est le cas !

## Sur Windows

Voici le code pour installer cette extension

```{.powershell linenos="true" breaklines="true" tabsize="2" fontsize="\small" bgcolor="turquoisefonce!10!white"}
Install-Module PSWindowsUpdate
```

Une fois installée, 

Nous allons configurer les mises à jour pour qu'elles s'installent chaque jour à 2h du matin.

```{.powershell linenos="true" breaklines="true" tabsize="2" fontsize="\small" bgcolor="turquoisefonce!10!white"}
$action = New-ScheduledTaskAction -Execute 'Get-WindowsUpdate -AcceptAll -Install -AutoReboot'
$trigger = New-ScheduledTaskTrigger -Daily -At 2am
Register-ScheduledTask -Action $action -Trigger $trigger -TaskName "mise-a-jour-nocturne"
```
