2014-09-04 2 views
0

여러 자바 파일의 md5sum을 텍스트 파일에 저장하려고합니다.하지만이 파일을 보면 md5sum이라는 경로가 만들어지며 파일 자체는 생성하지 않습니다.Bash는 md5sum 파일의 문자열이 아닌 문자열을 얻습니다.

find $FilesDirectory -iregex '.*\.java' | while read line; do 

if [ -f "$line" ] 
    then 
     echo -n $line | md5sum.exe | cut -d' ' -f1 | tr -d '\n' >> $FileName 
     echo -n "-" >> $FileName 
     echo -n $line | cut -d' ' -f2 >> $FileName 
    fi 
done 

마지막 줄 제외한 모든 줄 바꿈도 제거하려고합니다. md5sum의 경로를 존재하지 않는 파일로 변경했을 때 여전히 md5sum을 만들었습니다. (MINGW Shell을 사용하고 있습니다.)

+0

'md5sum.exe "$ line"| 잘라 내기 ... ' –

+0

'for. * line in * .java' –

+0

왜'.exe' 접미사가 있습니까? Cygwin에 오셨습니까? – tripleee

답변

1

, 당신은 단순히 파일의 md5sum을 (읽을 패턴 확장문자열 추출을 사용할 수 있습니다) 출력 할 이름 만 남기는 경로 정보를 제거하십시오.

find $FilesDirectory -iregex '.*\.java' | while read line; do 

if [ -f "$line" ] 
    then 
     md5str="$(md5sum "$line")" 
     sum=${md5str%% *} 
     sumfn=${md5str##* } 
     sumfn=${sumfn##*/} 

     echo "$sum-$sumfn" >> $FileName 
    fi 
done 
+0

글쎄, 이것은 오히려 완벽 해 보인다. 나는 이것을 잠시 시험해 볼 것이지만 지금까지 나는이 대답에 행복하게 여긴다. 감사한다. –

+0

다시 한번 감사드립니다. 꽤 큰 시험을 치렀고 모든 것이 완벽했습니다. 잘 했어! –

1

실제로 파일 이름이없는 md5sum은 표준 입력에서 파일 이름이없는 데이터 (인수가 아님)를 읽고 그에 대한 체크섬을 계산합니다.

실제로 stdin에서 인수를 읽어야 할 경우 echo filename | xargs md5sum이 해결 방법입니다.

하지만 여기에서는 그럴 필요가 없습니다.

find "$FilesDirectory" -type f -iregex '.*\.java' \ 
    -exec md5sum + | 
sed 's% *.*/%-%' >"$FileName" 

-type f은 발견 된 모든 파일에 대한 if [ -f ...-exec ... + 실행 md5sum을 대체합니다. 그런 다음 체크섬 다음에 공백이 실행되는 대신 대시 (-)를 넣기 위해 결과를 사후 처리합니다. 정규 표현식은 공백을 일치시킨 다음 마지막 슬래시까지의 모든 문자를 일치시키고 모든 것을 바꿉니다. 따라서 경로 이름도 제거됩니다.

모든 파일이 현재 디렉토리에있는 경우

, (당신이 find의 이전 버전이있는 경우. 대신 -exec md5sum {} \;를 사용 할 수 있습니다) 및 (와일드 카드와 일치하는 디렉토리가없는 경우 -type f에서 또한, 위의 불필요)과 와일드 카드 ("인수 목록이 너무 오래") 당신이 사용해야 할 경우 단순히

md5sum *.[jJ][aA][vV][aA] | ... 

을 할 수있는 너무 긴 steing으로 확장시킬 정도로 많은이 없습니다 find이고 하위 디렉터리가 있지만 트래버스하지 않으려는 경우 그 (것)들은 -maxdepth 1를 추가하십시오. 당신이 형식 md5sum-filename의 파일에 md5sum이와 파일 이름을 출력 대해 간단하게 걱정하는 경우가 어디 살 수 이제까지

+0

잘 보았습니다 : "find : '-exec'에 대한 인수가 없습니다. exec 온라인을 검색 한 후에 파일 이름을 인수로 사용하여 표준 입력을 파일로 리디렉션하는 방법을 찾았습니다. 그러나 나는이 경우에 그것을 사용하는 방법을 보지 못했다. –

+0

그건'-exec ... +'가'find'에 의해 지원되지 않는다는 표시입니다. '-exec ... {} \;'변종을 대신 사용해보십시오. – tripleee

관련 문제