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
– 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/ \;
- commence à rechercher des fichiers dans
$HOME
. - Sil trouve un fichier correspondant à
$HOME/$dir_name
il ne passera « pas en dessous ( » élague « le sous-répertoire). - 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