Remplacer les espaces dans KSH par SED

Je construis une commande de recherche par programme:

find "${SRC_DIR}" "${FILE_NAMES}" -type f -mtime +14 -level 0 

Où FILE_NAMES est le modèle de fichier auquel je dois correspondre, qui est une simple liste de modèles délimités par des espaces (* .txt, * .html, etc.).

Pour formater cette liste correctement pour la commande find, elle ne peut pas être une liste, elle doit ressembler à ceci:

 -name *.txt -o -name *.html 

Ma solution était d’utiliser:

 FILE_NAMES=$(echo ${FILES} | sed -e 's/\s+/-o -name /g') 

Mais cela ne fonctionne pas, en particulier, il ne semble pas comprendre que je veuille remplacer les espaces. Quelqu’un at-il un meilleur moyen de le faire?

Tous les seds ne prennent pas en charge les espaces réservés aux perl pour l’espace, les chiffres, etc. Je n’ai pas de moyen de tester votre cas exact, mais ce qui suit devrait être un bon guide.

De plus, notez que find -predicate -predicate .... est AND par défaut. pour que -o fonctionne, il faut que vous dépassiez tout ( (parens) ) ET pour que le shell ne voie pas le paren comme une requête pour lancer un sous-shell, vous devez échapper aux parens, c. \( .... -o .... \) . Donc, cela nous amène à

  set -vx; SRC_DIR="." ; FILE_NAMES="abc" find "${SRC_DIR}" \( $(echo "$FILE_NAMES"| sed 's/ / -o -name /g;s/^/-name /') \) -type f -mtime +14 -level 0 

SORTIE

 + echo 'abc' + sed 's/ / -o -name /g;s/^/-name /' + find . '\( -name a -o -name b -o -name c \)' -type f -mtime +14 -level 0 find: invalid predicate `-level' 

ce qui indique simplement que ma recherche ne supporte pas non plus le niveau.

éditez les caractères supplémentaires " supprimés sur le \(....\) .

aussi

Si vous utilisez un ksh93, il est possible d’utiliser des modificateurs de variables, comme

 ${FILE_NAME// / -o -name} 

Mais vous devrez soit concaténer le nom d’ouverture ou faire une deuxième substitution sur la valeur enregistrée de FILE_NAME.

Vous pouvez voir si vous avez ksh93 en lançant la cmd suivante

 echo ${.sh.version} 

Si vous obtenez une valeur, alors vous avez ksh93.

IHTH

ksh:

 FILES='*.txt *.html' FILE_NAMES=$( # $() runs this script in a subshell conjunction="" set -f # turn off file pattern expansion for patt in $FILES; do printf "%s -name '%s' " "$conjunction" "$patt" conjunction="-o" done ) find "${SRC_DIR}" ${FILE_NAMES} -type f -mtime +14 -level 0 

Notez que $FILE_NAMES n’est pas cité – vous souhaitez que le shell divise la variable en mots distincts.

Il pourrait être plus facile d’adopter une approche différente:

 find ${SRC_DIR} -type f -mtime +14 | egrep '\.(txt|html)$' 

J’ai -level 0 le -level 0 bit parce que je n’ai aucune idée de ce à quoi il sert – il n’existe pas dans la version que j’ai sous la main. Vous pourriez toujours le remettre dans …