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 ';'
Réponses:
-path
fonctionne exactement comme-name
, mais applique le modèle à l'ensemble du chemin d'accès du fichier examiné, au lieu du dernier composant.-prune
interdit de descendre en dessous du fichier trouvé, au cas où ce serait un répertoire.Tout mettre ensemble, la commande
$HOME
.$HOME/$dir_name
il n'ira pas en dessous ("élague" le sous-répertoire).-o
) s'il trouve un fichier correspondant,*$file_suffix
il le copie$HOME/$dir_name/
.L'idée semble être de faire une sauvegarde de certains contenus de
$HOME
dans un sous-répertoire de$HOME
. Les pièces avec-prune
sont évidemment nécessaires afin d'éviter de faire des sauvegardes de sauvegardes ...la source
-path
fonctionne comme-name
: il sélectionne les fichiers. La différence est que-name
correspond un modèle au nom de fichier, tandis que-path
correspond à un modèle au nom de chemin complet.find
descend toujours dans les sous-répertoires, sauf si empêché par-maxdepth
ou-prune
etc.-path $HOME/$dir_name
est une action. Il s'agit d'un test qui vérifie si le chemin du fichier en cours d'examen correspond à ce qui$HOME/$dir_name
est.-prune
est une action distincte. Je pense que la première phrase de votre premier commentaire reflète fidèlement comment cela fonctionne.Il fait partie de la commande find, l'instruction -exec.
Il vous permet d'interagir avec le fichier / répertoire trouvé par la
find
commande.find $HOME -path $HOME/$dir_name -prune -o -name "*$file_suffix" -exec cp {} $HOME/$dir_name/ \;
find $HOME
signifie trouver des fichiers / répertoires dans $ HOMEPour comprendre
-path <some_path>
, voir `find -path` expliquéPour comprendre
-prune
, voir /programming/1489277/how-to-use-prune-option-of-find-in-sh-o
signifie OU, donc-path <some_path>
OU-name *$file_suffix
-exec
signifie exécuter la commande.cp {} $HOME/$dir_name/
copier tous les fichiers correspondant à$HOME/$dir_name/
\;
signifie terminer la-exec
commandela source