2014-11-21 2 views
0

파일을 읽는 데 쉘 사용에 관한 질문이 있습니다.파일 이름 접두어 검사는 항상 bash로 실패합니다.

폴더

  • new_file.log (이 파일입니다)
  • new_file2.log (이 파일입니다)
  • new_file3.log : 그건 내가 이런 폴더가, 말을하는 것입니다
    • new_file_from_subfolder.log 새로운
    • (이 하위 폴더 인) (이 파일입니다)
    • new_file2_from_subfolder.log
    • new_file3_from_subfolder.log

는 내가 원하는 (직접) 파일이 아닌 하위 폴더에서 파일의 모든 내용을 읽을 것입니다. 위의 경우, new_file.log에 new_file.log가 필요합니다.

나는 간단한 방법이 알고

$ cat new*.log 

은 그러나 나는 또한 bash는 스크립트를 작성 :

for file in $(ls -a) 
do 
    if [[ "$file" != "." && "$file" != ".." ]]; then    
     if [[ -f "$file" && "$file" == "^new" ]]; then **here is the problem** 
      [do something] 
     fi 
    fi 
done 

내 문제는 위와 같이 표시됩니다. bash 코드는 doesnot처럼 보입니다

"$file" == ^new 

만약 내가 bash를 돌리면 기본적으로 아무것도하지 않습니다. 이는 파일이 조건을 만족시키지 못한다는 것을 의미합니다. 뭐가 잘못 되었나요?

+2

** 스크립트에서'ls'을 사용하지 마십시오. http://mywiki.wooledge.org/ParsingLs –

+0

을보십시오 ... 만일 당신이'for file * '을 숨겨진 파일들에 대해 반복하고 싶다면,'shopt -s dotglob'가 그 효과를 가질 것입니다. –

+2

...또한 수학 환경을 제외하고는 쉘에서'=='를 사용하는 습관이별로 좋지 않습니다. POSIX는'test'에 대해 숫자가 아닌 항등 연산자로'='를 지정합니다; '=='를 지원하는 쉘은 비표준 위임 확장으로 사용됩니다. 어쨌든 POSIX가 아니기 때문에'[[]]'의 실천이 좋지는 않지만 핑거 메모리가 (안전)'[[$ foo == $ bar]]를 (안전하지 않은)''$ foo "=="$ bar "]'또는''$ foo"== "$ bar"'테스트 할 수 있습니다. –

답변

2

은 glob 표현식이 아니라 정규식입니다. ^에는 특별한 의미가 없습니다.

당신은 아마

[[ $file = new* ]] 

또는 정규식

[[ $file =~ ^new ]] 
물론

, 실제 시나리오에서, 당신은 단지 이름 이상 만 반복하는 것 중 하나 글로브 식을 원하는 귀하의 접두사와 일치하는 내용 :

for file in new*; do 
    : something with "$file" 
done 

... 또는 재귀 (FD (3)를 사용하는 것은 그래서 당신은 여전히 ​​코드에서 사용자와 상호 작용할 수) : 당신이 잘못된 트랙을 아래로 향하고있어

while IFS= read -u 3 -r -d '' file; do 
    : something with "$file" 
done 3< <(find . -type f -name 'new*' -print0) 
+0

다양한 정보를 제공해 주셔서 감사합니다. –

2

. new으로 시작하는 모든 일반 파일을 반복하는 방법은 다음과 같습니다.

for file in new* 
do 
    if [[ -f $file ]] 
    then 
    dosomething "$file" 
    fi 
done 
관련 문제