Bash
查找名稱相同但內容不同的文件?
我想生成具有以下內容的文件列表:
- 一樣的名字
- 不同的內容
在目錄中(包括所有子目錄和內容)。
怎麼做?Bash,perl,什麼都好。
因此,不應顯示兩個具有相同名稱和相同內容的文件。
更新:修正了腳本中的一個錯字:
print $NF
改為print $3
; 也整理了一些東西,並添加了一些評論。假設文件名不包含
\n
,以下列印出一個排序列表,該列表在 unique 、 unique處中斷(如: section control breaks),並顯示相應的文件路徑組。file name``md5sum
#!/bin/bash # Choose which script to use for the final awk step out_script=out_all # Print all duplicated file names, even when md5sum is the same out_all='{ if( p1 != $1 ) { print nl $1; print I $2 } else if( p2 != $2 ) { print I $2 } print I I $3; p1=$1; p2=$2; nl="\n" } END { printf nl}' # Print only duplicated file names which have multiple md5sums. out_only='{ if( p1 != $1 ) { if( multi ) { print pend } multi=0; pend=$1 "\n" I $2 "\n" } else if( p2 != $2 ) { multi++; pend=pend I $2 "\n" } pend=pend I I $3 "\n"; p1=$1; p2=$2 } END { if( multi ) print pend }' # The main pipeline find "${1:-.}" -type f -name '*' | # awk for duplicate names awk -F/ '{ if( name[$NF] ) { dname[$NF]++ } name[$NF]=name[$NF] $0 "\n" } END { for( d in dname ) { printf name[d] } }' | # standard md5sum output xargs -d'\n' md5sum | # " "==text, "*"==binary sed 's/ [ *]/\x00/' | # prefix with file name awk -F/ '{ print $3 "\x00" $0 }' | # sort by name. md5sum, path sort | # awk to print result awk -F"\x00" -v"I= " "${!out_script}"
輸出僅顯示帶有**多個
md5
s 的文件名afile.html 53232474d80cf50b606069a821374a0a ./test/afile.html ./test/dir.svn/afile.html 6b1b4b5b7aa12cdbcc72a16215990417 ./test/dir.svn/dir.show/afile.html
輸出顯示所有同名文件。
afile.html 53232474d80cf50b606069a821374a0a ./test/afile.html ./test/dir.svn/afile.html 6b1b4b5b7aa12cdbcc72a16215990417 ./test/dir.svn/dir.show/afile.html fi le.html 53232474d80cf50b606069a821374a0a ./test/dir.svn/dir.show/fi le.html ./test/dir.svn/dir.svn/fi le.html file.html 53232474d80cf50b606069a821374a0a ./test/dir.show/dir.show/file.html ./test/dir.show/dir.svn/file.html file.svn 53232474d80cf50b606069a821374a0a ./test/dir.show/dir.show/file.svn ./test/dir.show/dir.svn/file.svn ./test/dir.svn/dir.show/file.svn ./test/dir.svn/dir.svn/file.svn file.txt 53232474d80cf50b606069a821374a0a ./test/dir.show/dir.show/file.txt ./test/dir.show/dir.svn/file.txt ./test/dir.svn/dir.show/file.txt ./test/dir.svn/dir.svn/file.txt