J'utilise find
pour localiser et supprimer des fichiers de sauvegarde, mais je souhaite exclure certains répertoires de la recherche. Les noms de fichiers de sauvegarde pourrait se terminer dans .bck
, bak
, ~
ou backup
.
Le code exemple de travail minimal (MWE) avec seulement trois répertoires à exclure est:
#! /bin/bash
find . -type d \( -path "./.*" -o -path "./Music" -o -path "./Documents" \) -prune -o -type f \( -name "*.bck" -o -name "*.bak" -o -name "*~" -o -name "*.backup" \) -print0 | xargs -0 --no-run-if-empty trash-put
La syntaxe \( -path "dir1" -o -path "dir2" ... -o -path "dirN" \) -prune
semble un peu maladroite, surtout s'il y a une dizaine de répertoires à exclure, même si je n'en ai montré que trois dans le MWE.
Existe-t-il une manière plus élégante d'utiliser soit un fichier d'entrée, avec la liste des répertoires exclus, soit une construction de type tableau ou liste, qui pourrait être mise en service?
Je suis désolé de ne pas avoir été plus explicite lorsque j'ai écrit ma question d'origine.
NB: trash-put
est un utilitaire qui déplace les fichiers vers au Trashcan
lieu de les supprimer [1].
Avec GNU find (c'est-à-dire sous Linux non intégré ou Cygwin), vous pouvez utiliser
-regex
pour combiner tous ces-path
caractères génériques en une seule expression régulière.Avec FreeBSD ou OSX, utilisez
-E
plutôt que-regextype posix-extended
.la source
Regroupez-les
-path ... -prune
en une seule expression en\( ... \)
utilisant la logique-o
( ou ).L'exemple ne sera pas des répertoires ou des fichiers Iterate à ou sous
/somepath/a
,/somepath/b
et/somepath/c
.Voici un exemple plus spécifique utilisant plusieurs actions.
la source
Cela semble être plus une question coquille qu'une
find
question. Avec un fichier contenant( -name dir1 -o -name dir2 ) -prune
(pas de "\"!), Vous pouvez simplement faire ceci:Sans changer l'appel de recherche lui-même (en
eval find
ou en changeant $ IFS), cela ne fonctionne qu'avec des chemins sans espace.Si vous voulez garder le fichier plus simple, vous pouvez écrire un script.
Et utilise
au lieu.
la source
-name
bypath
).\( -path "dir1" -o -path "dir2" ... -o -path "dirN" \) -prune
d'exclure certains répertoires de la recherche récursive qui lefind
fait. Je ne cherche rien dans les fichiers, mais plutôt la suppression de certains fichiers et l'évitement de certains répertoires dans mon chemin de recherche. Je ne comprends pas non plus ce que votre script essaie de faire. Il semble donc que nous ayons une mauvaise communication. Désolé. Laissez-nous en rester là.