J'ai un script simple que je comprends le plus, c'est la commande find qui n'est pas claire. J'ai beaucoup de documentation mais ça ne sert pas à le rendre beaucoup plus clair. Ma pensée est que cela fonctionne comme une boucle for, le fichier actuellement trouvé est échangé pour {} et copié dans $ HOME / $ dir_name, mais comment fonctionne la recherche avec -path et -prune -o ? C'est ennuyeux d'avoir une documentation aussi spécifique et pertinente et de ne toujours pas savoir ce qui se passe.
#!/bin/bash
# The files will be search on from the user's home
# directory and can only be backed up to a directory
# within $HOME
read -p "Which file types do you want to backup " file_suffix
read -p "Which directory do you want to backup to " dir_name
# The next lines creates the directory if it does not exist
test -d $HOME/$dir_name || mkdir -m 700 $HOME/$dir_name
# The find command will copy files that match the
# search criteria ie .sh . The -path, -prune and -o
# options are to exclude the backdirectory from the
# backup.
find $HOME -path $HOME/$dir_name -prune -o \
-name "*$file_suffix" -exec cp {} $HOME/$dir_name/ \;
exit 0
C'est juste la documentation dont je sais que je devrais être capable de comprendre cela.
-modèle de chemin
Le nom de fichier correspond au modèle de motif de coque. Les métacaractères ne traitent pas / ou . spécialement; ainsi, par exemple, trouver. -path "./sr*sc" affichera une entrée pour un répertoire appelé ./src/misc (s'il en existe un). Pour ignorer une arborescence de répertoires entière, utilisez -prune plutôt que de vérifier chaque fichier de l'arborescence. Par exemple, pour ignorer le répertoire src / emacs et tous les fichiers et répertoires situés en dessous, et imprimer les noms des autres fichiers trouvés, faites quelque chose comme ceci:
find . -path ./src/emacs -prune -o -print
- Action: commande -exec; Cette variante non sécurisée de l' action -execdir est spécifiée par POSIX. La principale différence est que la commande est exécutée dans le répertoire à partir duquel find a été invoquée, ce qui signifie que {} est développé en un chemin relatif commençant par le nom de l'un des répertoires de départ, plutôt que simplement le nom de base du fichier correspondant.
Alors que certaines implémentations de find ne remplacent le {} que là où il apparaît de lui-même dans un argument, GNU find remplace {} partout où il apparaît.
Et
Par exemple, pour comparer chaque fichier d'en-tête C dans ou en dessous du répertoire actuel avec le fichier / tmp / master:
find . -name '*.h' -execdir diff -u '{}' /tmp/master ';'