Linux上的文件分身

Linux 系统上的一些文件可能出现在多个位置。按照本文指示查找并识别这些“同卵双胞胎”,还可以了解为什么硬链接会如此有利。

识别使用同一个磁盘空间的文件依赖于利用文件使用相同的 inode 这一事实。这种数据结构存储除了文件名和内容之外的所有信息。如果两个或多个文件具有不同的名称和文件系统位置,但共享一个 inode,则它们还共享内容、所有权、权限等。

这些文件通常被称为“硬链接”,不像符号链接(即软链接)那样仅仅通过包含它们的名称指向其他文件,符号链接很容易在文件列表中通过第一个位置的 l 和引用文件的 -> 符号识别出来。

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

在单个目录中的硬链接并不是很明显,但它仍然非常容易找到。如果使用 ls -i 命令列出文件并按 inode 编号排序,则可以非常容易地挑选出硬链接。在这种类型的 ls 输出中,第一列显示 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 编号,任何匹配都会告诉你想知道的内容。

另一方面,如果你只是想知道某个特定文件是否是另一个文件的硬链接,那么有一种方法比浏览数百个文件的列表更简单,即 find 命令的 -samefile 选项将帮助你完成工作。

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

注意,提供给 find 命令的起始位置决定文件系统会扫描多少来进行匹配。在上面的示例中,我们正在查看当前目录和子目录。

使用 find 的 -ls 选项添加输出的详细信息可能更有说服力:

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

第一列显示 inode 编号,然后我们会看到文件权限、链接、所有者、文件大小、日期信息以及引用相同磁盘内容的文件的名称。注意,在这种情况下,链接字段是 “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 编号查找文件,如命令中所示。但是,此搜索可能涉及多个文件系统,因此可能会得到错误的结果。因为相同的 inode 编号可能会在另一个文件系统中使用,代表另一个文件。如果是这种情况,文件的其他详细信息将不相同。

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

注意,错误输出被重定向到 /dev/null ,这样我们就不必查看所有 “Permission denied” 错误,否则这些错误将显示在我们不允许查看的其他目录中。

此外,扫描包含相同内容但不共享 inode 的文件(即,简单的文本拷贝)将花费更多的时间和精力。

总结

以上所述是小编给大家介绍的Linux上的文件分身,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对我们网站的支持!
如果你觉得本文对你有帮助,欢迎转载,烦请注明出处,谢谢!

(0)

相关推荐

  • Linux下利用unzip命令如何解压多个文件详解

    linux中提示没有unzip命令解决方法 如果你如法使用unzip命令解压.zip文件,可能是你没有安装unzip软件,下面是安装方法 命令: yum list | grep zip/unzip #获取安装列表 安装命令: yum install zip #提示输入时,请输入y: 安装命令:yum install unzip #提示输入时,请输入y: Linux下直接使用unzip *.zip解压多个文件会报错 可以使用unzip '*.zip'或者 unzip "*.zip"或者u

  • Linux中如何查看已挂载的文件系统类型详解

    前言 如你所知,Linux 支持非常多的文件系统,例如 ext4.ext3.ext2.sysfs.securityfs.FAT16.FAT32.NTFS 等等,当前被使用最多的文件系统是 ext4.你曾经疑惑过你的 Linux 系统使用的是什么类型的文件系统吗?没有疑惑过?不用担心!我们将帮助你.本指南将解释如何在类 Unix 的操作系统中查看已挂载的文件系统类型. 在 Linux 中查看已挂载的文件系统类型 有很多种方法可以在 Linux 中查看已挂载的文件系统类型,下面我将给出 8 种不同的

  • Linux shell查找文件显示行号和对应区间的内容

    概述 有时候我们需要在一个文件大小不断变化的日志文件里,找寻一些错误信息.这个时候我们可以用如下的小技巧,找出错误日志的内容. CAT的时候显示行号 cat -n cart.log | grep "支付失败" SED找到错误日志的内容 sed -n '1000,2000p' cart.log 由于我们通过CAT命令已经知道行号了,只需要使用SED,输入一个行号的大概范围,就可以详细的展示上下文的日志内容了. 小技巧 如果公司里没有完善的查看日志的工具,例如ELK.那么借助上面的小工具,

  • Linux awk将文件某列按照逗号分隔的例子

    概述 当我们在处理线上故障的时候,经常会从数据库表查询出某个列. select product_id from order where user_id = 111; 查询出来的结果形式如下: 1 2 3 4 5 这个时候,我们通常会以 product_id in (1,2,3,4,5) 的形式去查找商品表,找出商品的详细信息.那么如何得到这个(1,2,3,4,5)呢.一种简单的做法就是利用awk. cat temp.txt | awk 'BEGIN{ORS=","} {print $0

  • 在Linux命令行中列出带有ls文件的技巧

    我在linux中学到的第一批命令之一是ls.了解系统上文件所在的目录中的内容很重要.不仅能看到和修改全的文件也很重要. 我的第一个linux备忘单是一页Linux手册,于1999年发布,并成为我的参考.当我开始探索Linux时,我把它录在桌子上,并经常提到它.列出文件ls -l在第一页的第一栏底部介绍. 稍后,我将学习这个最基本的命令的其他迭代.穿过ls命令时,我开始了解Linux文件权限的复杂性,了解什么是我的权限,以及需要什么根权限或sudo权限来更改.随着时间的推移,我在命令行上变得非常舒

  • Linux 文件权限的详细介绍

    Linux 的优秀之处就在于它的多用户.多任务的系统.Linux 一般将文件可存取访问的身份分为 3 个类别,分别是 owner.group.others,且 3 种身份各有 read.write.execute 等权限. 权限的三种身份 文件所有者(owner) 用户级别的文件权限,通常为文件的创建者,可以通过 chown 修改文件所有者. 用户组(group) 如果把用户组比作团队,用户就是其中的成员,团队中的队员对于该文件都有相同的权限.可以通过 chgrp 修改文件的用户组. 用户组最有

  • Linux上的文件分身

    Linux 系统上的一些文件可能出现在多个位置.按照本文指示查找并识别这些"同卵双胞胎",还可以了解为什么硬链接会如此有利. 识别使用同一个磁盘空间的文件依赖于利用文件使用相同的 inode 这一事实.这种数据结构存储除了文件名和内容之外的所有信息.如果两个或多个文件具有不同的名称和文件系统位置,但共享一个 inode,则它们还共享内容.所有权.权限等. 这些文件通常被称为"硬链接",不像符号链接(即软链接)那样仅仅通过包含它们的名称指向其他文件,符号链接很容易在文

  • Linux上的文件搜索命令实例详解

    locate 基础了解 在centos7上默认没有locate命令,需要先手动安装.安装步骤:http://www.cnblogs.com/feanmy/p/7676717.html locate命令搜索的后台数据库路径:/var/lib/mlocate/mlocate.db ls -hl /var/lib/mlocate total 1.2M -rw-r----- 1 root slocate 1.2M Oct 16 14:36 mlocate.db 更新数据库使用updatedb,配置文件为

  • linux上配置jdk时,java命令提示没有此文件或文件夹的解决方法

    出现这个问题可能有以下几种原因: 1.对该文件没有执行的权限. 2.我们的机器是64位的,而下载的jdk是32位的. 我就是后一种原因造成的,好久才想明白. 以上这篇linux上配置jdk时,java命令提示没有此文件或文件夹的解决方法就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持我们.

  • Linux ftp 命令行中下载文件get与上传文件put的命令应用详解

    介绍:从本地以用户anok登录的机器192.168.0.16上通过ftp远程登录到192.168.0.6的ftp服务器上,登录用户名是peo.以下为使用该连接做的实验. 查看远程ftp服务器上用户peo相应目录下的文件所使用的命令为:ls,登录到ftp后在ftp命令提示符下查看本地机器用户anok相应目录下文件的命令是:!ls.查询ftp命令可在提示符下输入:?,然后回车. 1.从远程ftp服务器下载文件的命令格式: get  远程ftp服务器上当前目录下要下载的文件名  [下载到本地机器上当前

  • Windwos下使用winscp和批处理实现通过SSH端口上传文件到Linux服务器上

    Windwos下使用winscp和批处理实现通过SSH端口上传文件到Linux服务器上 今天同事想在windows上使用winscp上传文件到linux服务器上,又想偷懒想使用批处理来进行上传,还好只固定上传一个php文件,多了还真不好搞. 1.下载winscp 大家可以去网上自己找,我把winscp安装在c:下的 2.把要执行的命令保存到文件winscp.bat里,这个winscp.bat可以自己创建,我是放在d:下的. winscp.bat脚本内容: 复制代码 代码如下: option co

  • linux下php上传文件注意事项

    本文实例为大家分享了linux下php上传文件注意事项,供大家参考,具体内容如下 1.修改上传目录权限 linux 修改某目录下所有所有子目录权限 chmod -R 777 html 修改某目录为任何用户都用写读执行权限 chmod a+rwx html 2.设置上传文件的根目录 //取得项目根目录 $siteRoot = dirname(__file__); 3.修改配置文件的上传大小 php.ini post_max_size = 200M upload_max_filesize = 200

  • 使用scp获取远程linux服务器上的文件 linux远程拷贝文件

    一.scp是什么? scp是secure copy的简写,用于在Linux下进行远程拷贝文件的命令,和它类似的命令有cp,不过cp只是在本机进行拷贝不能跨服务器,而且scp传输是加密的.可能会稍微影响一下速度. 二.scp有什么用? 1.我们需要获得远程服务器上的某个文件,远程服务器既没有配置ftp服务器,没有开启web服务器,也没有做共享,无法通过常规途径获得文件时,只需要通过scp命令便可轻松的达到目的. 2.我们需要将本机上的文件上传到远程服务器上,远程服务器没有开启ftp服务器或共享,无

  • 如何在windows桌面使用ftp上传文件到linux服务器

    首先在linux服务器上安装ftp [root@host2 test]#yum -y install ftp vsftpd [root@host2 test]#service vsftpd start [root@host2 test]#chkconfig vsftpd --list [root@host2 test]#/etc/init.d/iptables stop [root@host2 test]# ftp 192.168.0.142 Connected to 192.168.0.142

  • Linux上通过binlog文件恢复mysql数据库详细步骤

     一.binlog 介绍 服务器的二进制日志记录着该数据库的所有增删改的操作日志(前提是要在自己的服务器上开启binlog),还包括了这些操作的执行时间.为了显示这些二进制内容,我们可以使用mysqlbinlog命令来查看. 用途1:主从同步 用途2:恢复数据库(也是线上出现一次数据库文件丢失后,才对这个有所了解并学习的) mysqlbinlog命令用法:shell> mysqlbinlog [options] log_file ... <!--[if !supportLists]-->

  • Xshell实现Windows上传文件到Linux主机的方法

    写在前面,博主本身并没有开始做接口自动化测试,目前刚刚学完postman的教程,了解工具,现在脑海中基本上的框架是已经有了,因为我们知道postman的collection是可以命令行执行(nodejs+newman)的,那么就为我们做Jenkins持续集成提供了良好的基础,之前博主让开发分配了一个linux虚拟机,可以用来跑接口测试脚本,想来会比我的另一台win7性能要好,因为是centos,搞linux的对gui并不感冒,那么涉及到一个问题,我windows下面的collection jso

随机推荐