Jai un script simple que je comprends le plus, cest la commande find qui nest pas claire. Jai beaucoup de documentation, mais cela ne sert pas à clarifier les choses. Je pense que cela fonctionne comme une boucle for, le fichier actuellement trouvé est échangé contre {} et copié dans $ HOME / $ dir_name, mais comment se passe la recherche avec -path et -prune -o fonctionne? Cest ennuyeux davoir une documentation aussi spécifique et pertinente sans 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 

Cest juste la documentation que je sais que je devrais être capable de comprendre cela à partir de.

-path pattern

Le nom de fichier correspond au modèle de shell. Les méta-caractères ne traitent pas spécialement / ou . ; ainsi, par exemple, trouvez. -path « ./sr*sc » affichera une entrée pour un répertoire appelé ./src/misc (sil en existe un). Pour ignorer toute une arborescence de répertoires, utilisez -prune plutôt que de vérifier tous les fichiers de larborescence. Par exemple, pour ignorer le répertoire src / emacs et tous les fichiers et répertoires sous celui-ci, et afficher les noms des autres fichiers trouvés, faites quelque chose comme ceci:

find . -path ./src/emacs -prune -o -print

De Manuel Findutils

– Action: commande -exec; Cette variante non sécurisée de laction -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é appelé, ce qui signifie que {} est développé en un chemin relatif commençant par le nom de lun 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 seul dans un argument, GNU find remplace {} partout où il apparaît.

Et

Par exemple, pour comparer chaque fichier den-tête C dans ou en dessous du répertoire courant avec le fichier / tmp / master:

 find . -name "*.h" -execdir diff -u "{}" /tmp/master ";" 

Commentaires

  • Double possible de find: prune nignore pas le chemin spécifié
  • Je pense que si quelque chose est ‘ un duplicata de find-path expliqué même si la réponse à find: prune nignore pas le p spécifié ath a une réponse qui semble sappliquer à cette question. Peut-être que les réponses find-path expliqué ont du sens pour quelquun de plus expérimenté en script, mais elles ne maident ‘ pas. Les réponses présentées ici ont plus de sens pour moi jusquà présent, même si je ‘ commence tout juste à les examiner.

Réponse

-path fonctionne exactement comme -name, mais applique le modèle au chemin complet du fichier examiné, au lieu du dernier composant.

-prune interdit de descendre sous le fichier trouvé, au cas où il sagirait dun répertoire.

Pour tout rassembler, la commande

find $HOME -path $HOME/$dir_name -prune -o -name "*$file_suffix" -exec cp {} $HOME/$dir_name/ \; 
  1. commence à rechercher des fichiers dans $HOME.
  2. Sil trouve un fichier correspondant à $HOME/$dir_name il ne passera « pas en dessous ( » élague « le sous-répertoire).
  3. Sinon (-o) sil trouve un fichier correspondant à *$file_suffix le copie dans $HOME/$dir_name/.

Lidée semble être de faire une sauvegarde de certains contenus de $HOME dans un sous-répertoire tory de $HOME. Les parties avec -prune sont évidemment nécessaires afin déviter de faire des sauvegardes de sauvegardes …

Commentaires

  • Si je comprends bien: find parcourra chaque répertoire de $ HOME dans lequel il a les autorisations daccès, sauf $ HOME / $ dir_name, dans lequel il ne descendra pas (car laction délagage évaluera à true et le ou ne sera pas pris), recherche des fichiers qui se terminent par $ file_suffix. Puis dès quil en trouve un, il exécutera cp  » found_file.sh  » dans $ HOME / $ dir_name? De plus, -path permet un chemin vers un fichier, et est utile lorsque vous voulez que find descende dans les répertoires et ne fonctionne pas uniquement dans le répertoire courant?
  • Votre compréhension est presque correct. -path fonctionne comme -name: il sélectionne les fichiers. La différence est que -name fait correspondre un modèle au nom de fichier, tandis que -path fait correspondre un modèle au chemin complet. find descend toujours dans les sous-répertoires, sauf si cela est empêché par -maxdepth ou -prune etc.
  • Oh!-path est appliqué à $ HOME / $ dir_name -prune alors, il ‘ est lordre des commandes qui me dérangeait, et -path est nécessaire pour la commande prune car il doit correspondre au chemin complet du répertoire élagué.
  • @Darren Je ‘ je ne sais pas si cela ‘ est assez précis. -path $HOME/$dir_name est une action. Cest un test qui vérifie si le chemin du fichier en cours dexamen correspond à ce que $HOME/$dir_name est. -prune est une action distincte. Je pense que la première phrase de votre premier commentaire reflète exactement comment cela fonctionne.
  • Est-ce quil manquerait quelque chose pour le voir comme un tuyau? Jai échangé -prune avec -print et je pense que le flux est clair maintenant: find $ HOME | -path $ HOME / $ nom_rép | -print

Réponse

Cela fait partie de la commande find, linstruction -exec.

Il vous permet dinteragir avec le fichier / répertoire trouvé par la commande find.

find $HOME -path $HOME/$dir_name -prune -o -name "*$file_suffix" -exec cp {} $HOME/$dir_name/ \;

find $HOME signifie rechercher des fichiers / répertoires dans $ HOME

Pour comprendre -path <some_path>, voir `find -path` expliqué

Pour comprendre -prune, voir https://stackoverflow.com/questions/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 commande -exec

Laisser un commentaire

Votre adresse e-mail ne sera pas publiée. Les champs obligatoires sont indiqués avec *