2014-07-20 1 views
1

Dans l'un de mes scripts Bash j'ai répété deux fois ce code:Comment éviter de telles duplications de code dans un script Bash?

find "$source_dir" -type f \ 
      -iname "*.arw" \ 
      -or -iname "*.cr2" \ 
      -or -iname "*.crw" \ 
      -or -iname "*.jpeg" \ 
      -or -iname "*.jpg" \ 
      -or -iname "*.nef" \ 
      -or -iname "*.nrw" \ 
      -or -iname "*.orf" \ 
      -or -iname "*.pef" \ 
      -or -iname "*.png" \ 
      -or -iname "*.ptx" \ 
      -or -iname "*.raf" \ 
      -or -iname "*.raw" \ 
      -or -iname "*.rw2" \ 
      -or -iname "*.sr2" \ 
      -or -iname "*.srf" \ 
      -or -iname "*.srw" \ 
      -or -iname "*.tif" \ 
      -or -iname "*.tiff" \ 
      -or -iname "*.x3f" | (

    counter=0 

    while read image_file; do 
      (...) 

Il en existe deux find commandes effectuées sur les deux répertoires différents, mais avec les mêmes paramètres. Les résultats de chaque découverte sont traités de différentes manières. Je suis convaincu qu'il est possible d'éviter la duplication de code ici. Existe-t-il un moyen d'enrouler cette commande find dans une fonction qui stocke les résultats de recherche dans une structure de données? Cette structure de données doit être transmise au sous-shell qui itère sur ses éléments. Comment puis-je atteindre cet objectif?

+1

Si votre version de 'find' supporte, vous pouvez réduire considérablement la longueur de la commande: 'find" $ source_dir "-type f -iregex" *. (cr2 | crw | jpeg | ... | x3f) $ "'. – chepner

+1

De plus, techniquement, le prédicat '-type f' ne s'applique qu'aux fichiers' arw'; vous voulez probablement quelque chose comme 'find ... -type f \ (-iname" * .arw "-o -iname" * .cr2 -o ... \) '. – chepner

Répondre

2

Enveloppez la commande find en fonction

function myfind() { 
    find .... 
} 

puis l'utiliser comme il est une nouvelle commande

myfind | while read image_file; do .... 
+0

Aussi, si vous avez besoin de passer des paramètres à la fonction nouvellement créée alors c'est facile aussi - jetez un oeil à cela http://stackoverflow.com/questions/6212219/passing-parameters-to-a-bash-function – Soren

Questions connexes