2016-09-26 3 views
0

FTP 서버의 몇 가지 전달 폴더에서 특정 파일을 필터링하기 위해 작은 bash 스크립트를 만들려고하는데 파일이 특정 파일 이름 지정 규칙과 일치하면 통과해야합니다.명세서가 여러 가능성과 일치해야하는 경우

폴더를 처리하는 함수를 만들었습니다.

#!/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 

허용되는 이름 지정 규칙이있는 폴더가 각각 40 개가 넘기 때문에 IF 문에 변수로 동적으로 지정해야합니다.

하지만 작업을 얻을 []{}''""()``의 오른쪽 세트를 찾을 수 없습니다.

이 문제에 대한 도움이나 완전히 다른 접근 방법이 도움이 될 것입니다.

답변

1

귀하의 기능이 제대로 매개 변수를 캡슐화한다. 아마 이런 것 같아.

#!/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" 

find -print | while read 루프는 여전히 줄 바꿈을 포함하는 파일 이름에 대한 강력한 아니지만, 적어도이 원래 코드는하지 않았다 파일 이름에 수평 공백, 대처.

+0

감사합니다. 작동 중이며 구현되었습니다. 고마워. – SHLelieveld

-1

에 한번이 같은 진술 경우 분리 :

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

작동합니다.

+2

'[[...]]'에서'[...]'(으)로 변경할 필요가 없습니다. – chepner

2

bash의 논리적 or 연산자는 ||입니다 : 당신이 그것을 호출하기 전에 전역 변수마다 시간을 설정하지 않도록

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

나는 이것을 테스트했지만 정확한 결과를 얻지 못했다고 생각하지만 다시 시도 할 것이다. – SHLelieveld

+0

이것도 작동하는 것처럼 보였지만 $ {BASENAME}이 (가) – SHLelieveld

+0

안에있을 때만'[[...]]'안에'$ BASENAME'이 인용되어 있는지 여부는 중요하지 않습니다. – chepner

관련 문제