다음과 같이 가정하십시오 .
현재 디렉토리에 동일한 md5sum을 부여하는 중복 파일 이름을 한 줄에 나열
먼저 환경을 설치하십시오.
echo "hello" > file1; cp file1 file2; cp file2 file3;
쉘 스크립트 :
#!/bin/bash
#FileName: ls_duplicate.sh
## ls file in size-desc order and long listing format and long-iso timestyle
## -rw-rw-r-- 1 ubuntu ubuntu 6 2017-11-21 13:58 file1
## -rw-rw-r-- 1 ubuntu ubuntu 6 2017-11-21 13:58 file2
## -rw-rw-r-- 1 ubuntu ubuntu 5 2017-11-21 13:58 output
find -maxdepth 1 -type f -exec basename {} \; | xargs ls -lS --time-style=long-iso | awk 'BEGIN {
getline;getline;
prev_name=$8; prev_size=$5;
}
{
cur_name=$8;
cur_size=$5;
if (prev_size==cur_size)
{
"md5sum " prev_name | getline;
prev_md5_sum=$1;
"md5sum " cur_name | getline;
cur_md5_sum=$1;
# print(prev_name, prev_md5_sum, cur_name, cur_md5_sum); # debug
##if the two file is same size and same md5sum, then print duplicate file-name
if ( prev_md5_sum==cur_md5_sum ) { print prev_name; print cur_name;}
}
prev_size=cur_size; prev_name=cur_name;
}' | sort -u
현재 디렉토리의 파일 :
file1 file2 file3 ls_duplicate.sh
스크립트 실행 :./ls_duplicate.sh
산출:
file1 b1946ac92492d2347c6235b4d2611184 file2 b1946ac92492d2347c6235b4d2611184
file2 -rw-rw-r-- file3 b1946ac92492d2347c6235b4d2611184
그래서 여기서 무슨 일이 일어나고 -rw-rw-r--
있습니까?
글쎄, 나는 이것을 사용하는 대신 직접 해결합니다.
"md5sum " prev_name | getline;
prev_md5_sum=$1;
"md5sum " cur_name | getline;
cur_md5_sum=$1;
대신 사용
"md5sum " prev_name | getline md5_sum;
split(md5_sum, arr, " ");
prev_md5_sum=arr[1];
"md5sum " cur_name | getline md5_sum;
split(md5_sum, arr, " ");
cur_md5_sum=arr[1];
참고 : 스크립트에서 변경해야합니다 (원래 스크립트 는 작동 하지 않음).
다음과 같이 보입니다.
awk 코드를 수정하려고하지 않을 것입니다. 대신 fdupes
명령 의 기능을 복제하고 있다는 점에 유의하십시오 . 에서 맨 페이지 :
Searches the given path for duplicate files. Such files are found by
comparing file sizes and MD5 signatures, followed by a byte-by-byte
comparison.
이를 위해 복잡한 스크립트를 작성하는 대신 사용하는 것이 좋습니다.
실패하면 크기 검사를 제거하면 중복 항목을 훨씬 쉽게 찾을 수 있습니다.
$ md5sum * | sort -k1,1 | uniq -w32 -D
b1946ac92492d2347c6235b4d2611184 file1
b1946ac92492d2347c6235b4d2611184 file2
b1946ac92492d2347c6235b4d2611184 file3
의 모든 해시 md5sums
는 너비가 32 자이므로 uniq
해당 32 자만 비교하고 발견 된 모든 중복을 인쇄 하도록 print에 지시 하기 쉽습니다 .
절대적으로 크기 검사가 필요하다면 다소 복잡해 지지만 여전히 스크립트보다 간단합니다. find
파일 크기를 인쇄 할 수 있으므로 ls
혼합 할 필요가 없습니다 .
find . -maxdepth 1 -type f -printf "%s/%P\n" |
awk -F/ ' # Use / as delimiter, it wont appear in filename
s[$1]++ { # if the file size has appeared before
if (n[$1]) { # if the first name hasnt been printed yet
print n[$1] # print it and delete it
n[$1] = "";
}
print $2; # print filename with duplicated size
next
} {n[$1] = $2} # save filename for each new size encountered'
이 awk 명령은 크기가 중복 된 모든 파일을 인쇄합니다.
이제 md5sum | sort | uniq
앞서 언급 한 파이프 라인을 사용하십시오 .
find -maxdepth 1 -type f -printf "%s/%P\n" |
awk -F/ 's[$1]++ {if (n[$1]){print n[$1]} print $2; n[$1] = ""; next} {n[$1] = $2}' |
xargs -d '\n' md5sum |
sort -k1,1 |
uniq -w32 -D
이 기사는 인터넷에서 수집됩니다. 재 인쇄 할 때 출처를 알려주십시오.
침해가 발생한 경우 연락 주시기 바랍니다[email protected] 삭제
몇 마디 만하겠습니다