如何查找大小相同的文件?

San*_*ing 4 linux bash awk

我有一个像这样的文件结构

a/file1
a/file2
a/file3
a/...
b/file1
b/file2
b/file3
b/...
...
Run Code Online (Sandbox Code Playgroud)

在每个目录中,某些文件具有相同的文件大小,我想删除它们.

我想如果问题可以解决一个目录,例如dir a,那么我可以围绕它包裹一个for循环?

for f in *; do
???
done
Run Code Online (Sandbox Code Playgroud)

但是如何查找大小相同的文件?

Ken*_*ent 8

 ls -l|grep '^-'|awk '{if(a[$5]){ a[$5]=a[$5]"\n"$NF; b[$5]++;} else a[$5]=$NF} END{for(x in b)print a[x];}'
Run Code Online (Sandbox Code Playgroud)

这只会检查文件,没有目录.

$ 5是ls命令的大小

测试:

kent@ArchT60:/tmp/t$ ls -l
total 16
-rw-r--r-- 1 kent kent  51 Sep 24 22:23 a
-rw-r--r-- 1 kent kent 153 Sep 24 22:24 all
-rw-r--r-- 1 kent kent  51 Sep 24 22:23 b
-rw-r--r-- 1 kent kent  51 Sep 24 22:23 c
kent@ArchT60:/tmp/t$ ls -l|grep '^-'|awk '{if(a[$5]){ a[$5]=a[$5]"\n"$NF; b[$5]++;} else a[$5]=$NF} END{for(x in b)print a[x];}'
a
b
c
kent@ArchT60:/tmp/t$ 
Run Code Online (Sandbox Code Playgroud)

根据MichałŠrajer的评论更新:

现在也支持带空格的文件名

命令:

 ls -l|grep '^-'|awk '{ f=""; if(NF>9)for(i=9;i<=NF;i++)f=f?f" "$i:$i; else f=$9; 
        if(a[$5]){ a[$5]=a[$5]"\n"f; b[$5]++;} else a[$5]=f}END{for(x in b)print a[x];}'
Run Code Online (Sandbox Code Playgroud)

测试:

kent@ArchT60:/tmp/t$ l
total 24
-rw-r--r-- 1 kent kent  51 Sep 24 22:23 a
-rw-r--r-- 1 kent kent 153 Sep 24 22:24 all
-rw-r--r-- 1 kent kent  51 Sep 24 22:23 b
-rw-r--r-- 1 kent kent  51 Sep 24 22:23 c
-rw-r--r-- 1 kent kent  51 Sep 24 22:40 x y

kent@ArchT60:/tmp/t$ ls -l|grep '^-'|awk '{ f=""
        if(NF>9)for(i=9;i<=NF;i++)f=f?f" "$i:$i; else f=$9; 
        if(a[$5]){ a[$5]=a[$5]"\n"f; b[$5]++;} else a[$5]=f} END{for(x in b)print a[x];}'
a
b
c
x y

kent@ArchT60:/tmp/t$
Run Code Online (Sandbox Code Playgroud)


Mic*_*jer 5

使用“带空格的文件名”的解决方案(基于Kent(+1)和awiebe(+1)帖子):

for FILE in *; do stat -c"%s/%n" "$FILE"; done | awk -F/ '{if ($1 in a)print $2; else a[$1]=1}' | xargs echo rm
Run Code Online (Sandbox Code Playgroud)

要删除重复项,请echo从xargs中删除。