我有一个像这样的文件结构
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)
但是如何查找大小相同的文件?
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)
使用“带空格的文件名”的解决方案(基于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中删除。