2009-03-24 3 views
1

는 다음 샘플 데이터내가 코드를 실행

md5deep find * | awk '{ print $1 }' 

에게 출력

/Users/math/Documents/Articles/Number theory: Is a directory 
    258fe6853b1bfb2d07f512ff6bec52b1 
    /Users/math/Documents/Articles/Probability and statistics: Is a directory 
    4811bfb2ad04b9f4318049c01ebb52ef 
    8aae4ac3694658cf90005dbdea37b4d5 
    258fe6853b1bfb2d07f512ff6bec52b1 

I의 샘플을 나에게 준다 SED/AWK에 의해 "디렉토리가" 을 포함하는 행을 필터링하려고 시도했습니다.은 SED별로

md5deep find * | awk '{ print $1 }' | sed s/\/*//g 

그것의 샘플 출력은

입니다
/Users/math/Documents/Articles/Number theory: Is a directory 
/Users/math/Documents/Articles/Topology: Is a directory 
/Users/math/Documents/Articles/useful: Is a directory 
내가 SED/AWK에 의해 "디렉토리인가"를 포함 각 행을 필터링 할 수 있습니다 어떻게

?

는 [설명]을 내가 를 포함하는 행을 필터링 할 디렉토리입니다.

답변

2

은 내가 md5deep 도구를 사용하지 않은,하지만 난 그 선은 오류 메시지입니다 믿는다 그들은 표준 출력 대신 standard error이 될 것이므로 파이프를 통하지 않고 직접 터미널로갑니다. 따라서 sed 명령으로 필터링되지 않습니다. 당신이

md5deep `find *` 

를 호출하고 찾을하려는 당신은 당신의 표준 오류 및 표준 출력 스트림을 병합하여 그들을 필터링 할 수 있지만

그것은처럼 보이는

은 (당신이 역 인용 부호를 누락 때문에 나는 확실하지 않다) 모든 파일과 디렉토리를 반환합니다. 당신이 수행 할 수 있습니다 무엇에

일부 노트 : md5deep는 "재귀"옵션에 대한 -r을 가지고 같은

  • 것 같습니다. 따라서 다음 명령을 시도해보십시오.

    md5deep -r * 
    

    find 명령 대신.

  • find 명령을 사용하려는 경우 파일 및 디렉터리 대신 -type f을 사용하는 파일로만 제한 할 수 있습니다.또한 찾기 명령에 *을 전달할 필요가 없습니다 (find이 이해하는 옵션 이름과 같은 파일이 있으면 find을 혼동 할 수 있음). .을 전달하면 현재 디렉토리를 재귀 적으로 검색합니다.

    sed에서
    find . -type f 
    
  • 당신이 당신의 패턴에 슬래시를 사용하고자하는 경우, 그것은 \ 제대로을 인용 고통을 수 있습니다. 대신 다른 문자를 선택하여 정규식을 구분할 수 있습니다. seds 명령 다음의 첫 번째 문자를 구분 기호로 사용합니다. 패턴에도 .이 부족합니다. 정규 표현식에서 .을 사용하는 문자의 인스턴스 하나를 나타내며 "앞의 표현식이 0 개 이상"이면 *을 사용하므로 .*은 "0 개 이상의 문자 없음"을 나타냅니다 (glob 패턴과 다르며, *은 "0 이상의 모든 문자"를 의미합니다). 당신이 정말로 당신의 표준 출력에 표준 오류 스트림에 포함되고 싶지 않기 때문에이 파이프를 통과 할 경우

    sed "s|/.*||g" 
    
  • , 당신은 실행할 수 있습니다 : 당신은 그냥 원하는 경우

    md5deep `find *` 2>&1 | awk ... 
    
  • md5deep `find *` 2>/dev/null | awk ... 
    
: 표준 에러를 무시, 당신은 그것으로 간다 단지 아무것도 폐기 특수 파일 인 /dev/null 해당 리디렉션 할 수 있습니다 요약

, 나는 아래의 명령은 즉시 문제에 당신을 도울 것입니다 생각, 나는 당신이 찾고 있던 무슨 undersand하지 않은 경우 위의 다른 제안 당신을 도울 수 있습니다

md5deep -r * | awk '{ print $1 }' 
+0

마지막 명령이 계속 실행됩니다. 종료되지 않습니다. md5deep -r이 작동하지 않는 것 같습니다. –

+0

죄송합니다. md5deep에 파일 이름 인수가 필요합니다. 그래서 md5deep -r *가 작동합니다. 인수가 주어지지 않으면 표준 입력을 기다리고 있습니다. –

+0

마지막 명령이 작동합니다! --- 명령 md5deep'find *'를 사용하여 저의 실수는 제가 똑똑한 것을 사용하지 않았다는 것입니다. 명령은 sterr과 stout을 동일한 출력에 놓습니다. stout과 sterr을 별도의 파일로 저장하는 것 외에는 sterr을 무시할 수있는 방법이 있습니까? –

1

왜 grep을 사용하지 않습니까? 즉

,

md5deep find * | grep "Is a directory" | awk '{ print $1 }' 

편집 : 난 그냥 질문을 다시 읽고이 디렉토리에 라인을 제거 할 경우의 grep -v 플래그, 즉 사용

md5deep find * | grep -v "Is a directory" | awk '{ print $1 }' 
+0

마지막 명령이 작동하는 것 같습니다. 첫 번째 문제점은 뚱뚱한 녀석과 뚱뚱한 녀석이 같은 결과를 내고 있다는 것이 었습니다. 명령 끝에 1> hashes.txt 명령을 넣어야했습니다. md5deep이 예상대로 작동하지 않는 것 같습니다. 하위 디렉토리가 아닌 현재 디렉토리에있는 파일 만 해시합니다. –

+0

grep을 사용할 필요가 없습니다. >>> md5deep find * | awk '/ 디렉토리/{print $ 1}' – ghostdog74

0

나는 md5deep에 익숙하지 않지만이 일 수 있습니다.

find -type f -exec md5sum {} + 
2

구체적으로 답변을 설명 : awk 및 sed를 사용하여 행을 필터링하는 방법 :

awk '/Is a directory/ {next} {print}' 
sed 'g/Is a directory/d' 
+0

첫 번째 명령이 작동합니다. 그러나 마지막 하나는 그렇지 않습니다. Mac/Linux에서 따옴표가 필요 없다는 느낌이 들기 때문에 따옴표없이 명령을 시도했습니다. –

+0

아 맞아. 나는 전 'g/re/d'명령을 생각하고 있었다. sed의 경우 : sed '/ dir/d'('g'제외) 그렇습니다. sed 스크립트를 sed 명령의 단일 인수로 전달하려면 따옴표가 필요합니다. –

관련 문제