2013-07-23 2 views
0

현재 디렉터리에서 이름 보고서를 포함하고 확장명이 끝나지 않은 모든 파일을 찾으려고합니다 .log 사용할 수있는 방법이 있습니까? 한 번에 같은 것을 찾으려면 정규식을 사용 하시겠습니까?Regex .log 확장자없이 파일 이름을 포함하는 보고서

ls -la | grep ".*report*" | grep -v ".log" 

그러나 내가 [^ 알고

ls -l .*report*[^.log] 

아래 같은 라인에서 같은 일을 달성 할 수 있는지 궁금 해서요 :

이것은 내가 지금까지 내놓았다 한 것입니다. 로그] 확장자가 .log 인 파일을 필터링하지 않습니다. regex를 사용하여 동일한 결과를 얻는 방법. BASH btw를 사용하고 있습니다. 감사.

+0

셸은'[[$ a = ~ $ re]]'표현식 밖의 정규식을 지원하지 않으므로 외부 명령을 사용하고 싶지 않으면 glob 패턴에 대해 질문해야합니다. –

답변

2

당신은이에 대한 extglob를 사용할 수 있습니다. 예를 들어 :

shopt -s extglob nullglob 
files=(report!(*.log)) 

... 테스트를 위해, 물론, 당신은 사용할 수 있습니다 ls (비록 shouldn't be used in scripts) :

shopt -s extglob 
ls -l report!(*.log) 

... 모든 파일이 report로 시작하지만, 끝나지 않는 찾을 것입니다 .log을 입력하고 이름을 files이라는 배열에 넣습니다. nullglob 옵션을 설정하면 파일이 일치하지 않으면 패턴 자체가 결과로 반환되지 않습니다. 하지,

if ((${#files[@]})); then 
    echo "Found some files that need to be deleted!" 
    rm -f "${files[@]}" 
else 
    echo "Nothing but .log files for the reports" 
fi 

이 확장 글로브 패턴입니다 (shopt -u extglob가 다시 떨어져 그 확장을집니다 shopt -s extglob 명령을 켜지) :

당신은 그 배열의 내용을 확인하기 위해 다음과 같이 뭔가를 할 수 정규식. (*.log과 같은 표현식은 정규 표현식이 아닌 glob 패턴이기 때문에 유사한 정규 표현식은 .*[.]log처럼 보이며 쉘에서 사용하는 것과 다릅니다.

+0

감사하지만, 로그 파일이 걸러지지 않을 수도 있습니다. 아래의 결과를보십시오. [user1 @ fedora16a] $ shopt -s extglob [user1 @ fedora16a] $ ls -l report *! (. log) -rw-rw-r--. 1 user1 user1 0 7 월 23 일 16:14 report1 -rw-rw-r--. 1 user1 user1 0 7 월 23 일 16:14 report2 -rw-rw-r--. 1 user1 user1 0 7 월 23 일 16:14 report3.log -rw-rw-r--. 1 user1 user1 0 7 월 23 일 16:14 report4.log -rw-rw-r--. 1 user1 user1 0 7 월 23 16:35 report.loge – CppLearner

+0

@CppLearner 의견을 보내 주셔서 감사합니다 - 문자 위에 와일드 카드를 이동해야만합니다 :'report! (*. log) ' –

+0

이것은 트릭을 수행했습니다 :) 고마워요.이게 내가 +1하고 대답으로 받아들이는 것입니다. – CppLearner

1

당신은 할 수 있습니다 :

ls -ld !(*.log) 

이 현재 폴더가 .log로 끝나는 모든 파일/디렉토리를 표시합니다.

가 이

지금까지 내가 아는 한, 그래서 모두 include *report* + exclude .log

를 필터링 일반적으로 할 수있는 방법이 없습니다, 가장 깨끗한 방법은 다음과 같습니다

ls -ald *report* | grep -v '\.log' 
+0

+1, 저에게 알려 주셔서 감사합니다!() 옵션을 사용하고 "filter to include both report * + exclude .log"라고 정확하게 말합니다. 나는 오늘 밤에 누군가가 한 번에 그것을하기 위해 알고있는 비틀기가 있는지 알기를 기다릴 것이다. – CppLearner

+1

정규식은 틀리다. 'grep -v '\ .log $''를 의미합니다. 별표는 반복 후위 연산자입니다. postfixing nothing은 유효하지 않은 문법이지만, 많은'grep '구현은 단지 선두 문자'*'를 자동으로 무시할 것이다. – tripleee

+0

맞아, 짧은 brainfreeze있어 – mishik

2

당신은 말할 수 있습니다 :

find . -type f \(-name "*report*" -a ! -name "*.log" \) 

이렇게하면 패턴 report과 일치하고 현재 디렉터에서 .log으로 끝나는 파일을 제외합니다 모든 하위 디렉토리. 당신은 현재 디렉토리에서 찾으려면

, 당신은 말할 수 :

find . -maxdepth 1 -type f \(-name "*report*" -a ! -name "*.log" \) 
+0

와우, 고마워. +1 나를 알게 해주고 찾기 위해서. 이것은 편리합니다 :) 우리가 어떻게 든 포함과 부정의 힘을 정규식을 통해서만 사용할 수 있는지 궁금 해서요. find를 사용하지 않고 찾을 수 있습니다. – CppLearner

+0

'find'를 원하지 않으면 @mishik이 제안한 접근 방식을 채택 할 수 있습니다. 그러나'find '는 훨씬 더 강력합니다. – devnull

2

어쨌든이 파일들에 대해 루프를 돌리고 있다면, 루프 상단의 로그를 건너 뛰는 것은 간단합니다.

for f in *report*; do 
    case $f in *.log) continue ;; esac 
    : 
    : do stuff with "$f" here 
done 

제대로 대부분의 모든 곳에서 따옴표로 "$f"를 사용해야 공지 사항,하지만 case 후 그들은 필요하지 않습니다.

+0

+1 'for'perspective :). for 루프 구문을 알고 있었지만, 문제와 함께 사용하여 내 문제를 해결하지 못했습니다. 감사. – CppLearner

관련 문제