2016-09-26 2 views
0

Ich versuche, ein kleines Bash-Skript zu machen, bestimmte Dateien aus einigen Lieferordnern eines FTP-Servers zu filtern, und wenn die Dateien mit einer bestimmten Dateibenennungskonvention übereinstimmen, sollte es passieren.Wenn Anweisung muss mehrere Möglichkeiten übereinstimmen

Ich habe eine Funktion zum Verarbeiten der Ordner erstellt.

#!/bin/bash 

function folder_search { 
find FILE in `find ${DIR}/ -maxdepth 1 -type f -mmin +5 -name "*.doc" `; do 
BASENAME=`basename $FILE` 
if [[ $BASENAME == $NAMECONV1 or $BASENAME == $NAMECONV2 ]] 
then 
    "some commands" 
else 
    "some other commands" 
fi 
} 

#folder 1 
DIR=/tmp/folder1 
NAMECONV1="ABC[0-9][0-9][0-9].doc" 
NAMECONV2="NL[0-9][0-9][0-9].doc" 
folder_search 

#folder 2 
DIR=/tmp/folder2 
NAMECONV1="ABC[0-9][0-9][0-9].doc" 
NAMECONV2="B[0-9][0-9][0-9].doc" 
folder_search 

Es gibt mehr als 40 Ordner mit jeweils ihrer eigenen akzeptierten Namenskonvention, also muß ich es dynamisch von Variablen in der IF-Anweisung haben.

Aber ich kann nicht die richtige Menge von []{}''""()``, um es Arbeit finden.

Jede Hilfe zu diesem oder einem ganz anderen Ansatz würde helfen.

Antwort

1

Ihre Funktion sollte richtig seine Parameter kapseln, so dass Sie nicht eine globale Variable jedes Mal vor dem Aufruf gesetzt haben. Vielleicht so etwas.

#!/bin/bash 

# for portability, don't use the function keyword 
folder_search() { 
    # Don't use uppercase for your private variable names 
    local dir=$1 
    local pat1=$2 
    local pat2=$3 
    local filename base 
    # Don't loop over `find` with for 
    find "$dir" -maxdepth 1 -type f -mmin +5 -name "*.doc" -print | 
    while IFS='' read -r filename; do 
     base=$(basename "$filename") 
     if [[ "$base" == $pat1 || "$base" == $pat2 ]]; then 
      "some commands" 
     else 
      "some other commands" 
     fi 
    done 
} 

#folder 1 
folder_search /tmp/folder1 "ABC[0-9][0-9][0-9].doc" "NL[0-9][0-9][0-9].doc" 

#folder 2 
folder_search /tmp/folder2 "ABC[0-9][0-9][0-9].doc" "B[0-9][0-9][0-9].doc" 

Die find -print | while read Schleife ist noch nicht robust für Dateinamen, die Zeilenumbrüche enthalten, aber zumindest meistert diese horizontale Leerzeichen in den Dateinamen, die Ihren ursprünglichen Code nicht.

+0

Danke, das funktioniert und ist implementiert. Danke dafür. – SHLelieveld

-1

Versuchen Sie, wenn Aussagen wie diese Trennung:

if [ $this == $that ] || [ $that !- $something ]; 

funktionieren sollte.

+2

Kein Wechsel von '[[...]]' zu '[...]' erforderlich. – chepner

2

Die logische or Operator in bash ist ||:

if [[ $BASENAME == $NAMECONV1 || $BASENAME == $NAMECONV2 ]] 
+0

Ich glaube, ich habe das getestet und es gab mir nicht das richtige Ergebnis, aber ich werde es noch einmal versuchen. – SHLelieveld

+0

Dies schien auch zu funktionieren, aber nur wenn der $ {BASENAME} zwischen "" – SHLelieveld

+0

Inside '[[...]]' gesetzt wird, sollte es egal sein, ob '$ BASENAME' zitiert wird oder nicht. – chepner

Verwandte Themen