Linux下如何寻找相同文件?

------摘自微信公众号《良许linux》

随着电脑的使用,系统里将产生很多垃圾,最典型的就是同一份文件被保存到了不同的位置,这样导致的结果就是磁盘空间被大量占用,系统运行越来越慢。

所以如果你的电脑空间告急的话,可以试着去删除这样的文件,释放一些空间。在 Linux 下,我们可以通过识别文件的 inode 值来找出系统中的相同文件。

inode 是一个数据结构,记录了文件所有信息,除了文件名和文件内容。如果两个或多个文件具有相同的 inode 值,即使它们的文件名不一样,位置不一样,它们的内容、所有者、权限其实都是一样的,我们可以将其视有相同文件。

这类型的文件其实就是所谓的「硬链接」。硬链接具有相同的 inode 值,但文件名不一样。而软链接其实就是快捷方式,它指向目标文件,但有着自己的 inode 值。

$ ls -l my*
-rw-r--r-- 4 liangxu liangxu 228 Apr 12 19:37 myfile
lrwxrwxrwx 1 liangxu liangxu 6 Apr 15 11:18 myref -> myfile
-rw-r--r-- 4 liangxu liangxu 228 Apr 12 19:37 mytwin

我们无法直接知道同一目录下有哪些文件是有相同的 inode 值,但要识别起来也不难。其实我们只要使用 ls -i 命令,再以 inode 值进行排序,就可以直接找到这些文件。

$ ls -i | sort -n | more
...
788000 myfile <==
788000 mytwin <==
801865 Name_Labels.pdf
786692 never leave home angry
920242 NFCU_Docs
800247 nmap-notes

在这个结果的第一列里,就是对应的 inode 值。所以从这个结果里我们一眼就可以看出来,哪些文件具有相同 inode 值。

如果你只是想找到一个文件的对应硬链接文件,我们可以使用 find 命令,再加个 -samefile 选项即可快速找到。

$ find . -samefile myfile
./myfile
./save/mycopy
./mytwin

这些文件都是有相同的 inode 值,不信的话可以再使用 ls 命令来查看更多信息:

$ find . -samefile myfile -ls
788000 4 -rw-r--r-- 4 liangxu liangxu 228 Apr 12 19:37 ./myfile
788000 4 -rw-r--r-- 4 liangxu liangxu 228 Apr 12 19:37 ./save/mycopy
788000 4 -rw-r--r-- 4 liangxu liangxu 228 Apr 12 19:37 ./mytwin

我们可以看到,除了文件名之外,这几个文件名的信息完全一样。细心的朋友可能会注意到,在第2列(硬连接数)是4,而实际上我们找出来的文件只有3个,这说明还有一个文件与他们共享 inode 值,只是我们通过这条命令没有找出来而已。

作为一个懒人,每次敲命令多麻烦,直接上脚本找出目录下的相同文件!

#!/bin/bash

# seaches for files sharing inodes

prev=""

# list files by inode
ls -i | sort -n > /tmp/$0

# search through file for duplicate inode #s
while read line
do
inode=`echo $line | awk ‘{print $1}‘`
if [ "$inode" == "$prev" ]; then
grep $inode /tmp/$0
fi
prev=$inode
done < /tmp/$0

# clean up
rm /tmp/$0

运行结果:

$ ./findHardLinks
788000 myfile
788000 mytwin

当然了,你还可以使用 find 命令,根据 inode 值,找到系统里所有相同文件。

$ find / -inum 788000 -ls 2> /dev/null
788000 4 -rw-r--r-- 4 liangxu liangxu 228 Apr 12 19:37 /tmp/mycopy
788000 4 -rw-r--r-- 4 liangxu liangxu 228 Apr 12 19:37 /home/liangxu/myfile
788000 4 -rw-r--r-- 4 liangxu liangxu 228 Apr 12 19:37 /home/liangxu/save/mycopy
788000 4 -rw-r--r-- 4 liangxu liangxu 228 Apr 12 19:37 /home/liangxu/mytwin

在这条命令里,我们将错误提示重定向到 /dev/null 这个特殊文件里,这样在搜索一些我们没有权限访问的路径时,不会满屏的 permission denied 。

Linux下如何寻找相同文件?


推荐文章
Linux环境下安装yum

 若出现以下错误则代表需要重新安装yum: ThissystemisnotregisteredtoRedHatSubscriptionManagement.Youcanusesubscription

在Eclipse或者STS中使用SVN插件

在Eclipse/STS安装SVN插件  在STS4中默认是没有SVN插件的,需要我们手动安装SVN插件安装有两种方式,一种是在线安装,一种是离线安装但是在线安装,由于网络问题,一般很难安装成功,所以

【Linux】crontab 每隔1小时 2小时的执行job写法

crontab-l crontab-e   每五分钟执行 */5**** 每小时执行    0**** 每2小时执行    0*/2*** 每天执行       00*** 每周执行  

《linux 内核完全剖析》 mktime.c

tm结构体的定义在time.h里面 structtm{ inttm_sec; inttm_min; inttm_hour; inttm_mday; inttm_mon; inttm_year; in

如何删除Mac 的启动台(应用)残留的图标

如何删除MacOs启动台(应用)残留的图标方法很简单,删除“启动台”数据库里对应app的信息即可忘记什么版本的时候以前在“应用程序”删除应用后,启动台自动更新删掉不知道什么时候开始,直接在“应用程序”

linux和ubuntu区别是什么?有什么关系?

  Ubuntu:是一个以桌面应用为主的开源gnu、Linux操作系统,Ubuntu是基于DebianGNU/Linux,支持x86、amd64(即x64)和ppc架构。首个版本Ubuntu以Debi

Linux # kubuntu 14.04 登陆界面乱码,停止,进不了系统

问题描述:             kubuntu14.04登陆界面乱码,停止,进不了系统分析思路: 解决过程: 问题总结: 参考: lubuntu登陆界面乱码,如何解决?-查看主题?Ubuntu中

《SLAM机器人基础教程》第五章 Linux基础

第五章Linux基础本章基于树莓派,以ubuntu为例讲解Linux。本章内容规划:5.1节,Linux概述5.2节,系统安装5.3节,Linux指令及ubuntu的使用5.4节,SSH和VNC5.5

eclipse 版本号

Eclipse 3.1 版本代号 IO 【木卫1,伊奥】  Eclipse 3.2 版本代号 Callisto 【木卫四,卡里斯托 】Eclipse 3.3 版本代号 Eruopa 【木卫二,欧罗巴

Linux iconv使用

iconv[选项】文件输入/输出格式规范:-f, --from-code=名称原始文本编码-t,--to-code=名称 输出编码信息:-l,--list 列举所有已知的字符集输出控制:-c

【Linux学习】Ubuntu下内核编译(一)

(1)当要执行内核配置时,输入makemenuconfig时出现错误 遇到这个问题,主要是以为没有ncurses库,而makemenconfig需要这个库,因此需要安装ncurses或者ncurse

Linux编程:--消息队列(MessageQueue)相关概念和原理

 一、消息队列概述消息队列(MessageQueue,简称为MQ)其本质是就是个队列,FIFO先进先出,只不过是队列中储放的主要内容是message,因而叫消息队列主要用于:不同的服务server、进

VMware workstation 14永久激活密钥、注册码

VMwareworkstation14永久激活密钥、注册码CG54H-D8D0H-H8DHY-C6X7X-N2KG6ZC3WK-AFXEK-488JP-A7MQX-XL8YFAC5XK-0ZD4H-0

linux find命令

由于find具有强大的功能,所以它的选项也很多,其中大部分选项都值得我们花时间来了解一下。即使系统中含有网络文件系统(NFS ),find命令在该文件系统中同样有效,只你具有相应的权限。 在运

会话缓存(Session Cache)?

最常用的一种使用Redis的情景是会话缓存(sessioncache)。用Redis缓存会话比其他存储(如Memcached)的优势在于:Redis提供持久化。当维护一个不是严格要求一致性的缓存时,如

linux详解sudoers

sudo使用  Linux是多用户多任务的操作系统,共享该系统的用户往往不只一个。出于安全性考虑,有必要通过useradd创建一些非root用户,只让它们拥有不完全的权限;如有必要,再来提升权限执行。

Mac下搭建react开发环境

安装node 官网下载 https://nodejs.org/en/ 双击安装,接下来都是默认选择即可,直至安装成功 测试是否安装成功,分别输入以下命令: node-v npm-v 如下

linux系统开启秘钥认证登录详解

本文以已经产生好私钥和公钥为前提去讲述后续的增加秘钥认证的步骤:(秘钥的生成工具为:ssh-keygen,命令执行完后会在当前用户的家目录中生成了一个.ssh的隐藏目录,内含两个密钥文件。id_rsa

Ubuntu 常用的录屏、截图、Gif 软件!

项目汇报要录制一些视频和截图、Gif等,于是就收集了一些好用的软件,安装方法如下,使用方法都很容易就不介绍了:1.录屏SimpleScreenRecorder(建议)sudoadd-apt-repos

Linux下 boost库编译并加入到环境变量

1、下载源码:http://www.boost.org/2、tarzxvfboost_1_70_0.tar.gz3、cdboost_1_70_04、./bootstrap.sh--with-libra