Sandra Henry-Stocker 发布的文章

随着 Undo 发布 Live Recorder 5.0,这使得在多进程系统上的调试变得更加轻松。

随着 Undo 发布 Live Recorder 5.0,Linux 调试迈出了一大步。该产品于上个月发布,这使得在多进程系统上的调试变得更加轻松。它基于 飞行记录仪技术 flight recorder technology ,它更加深入进程之中,以深入了解每个进程的情况。这包括内存、线程、程序流,服务调用等。为了实现这一目标,Live Recorder 5.0 的记录、重放和调试功能都得到了增强,能够:

  • 记录进程更改共享内存变量的确切顺序。甚至可以针对特定变量并在任何进程中跳转到最后修改该变量的一行。
  • 通过随机化线程执行来暴露潜在缺陷,以帮助揭示竞态、崩溃和其他多线程缺陷。
  • 记录并重放单个 Kubernetes 和 Docker 容器的执行,以帮助在微服务环境中更快地解决缺陷。

Undo Live Recorder 使工程团队能够记录和重放任何软件程序的执行,而无论软件多么复杂。并且可以诊断和修复测试或生产中问题的根本原因。

根据你的许可证,Live Recorder 可以在命令行中使用 live-record 命令,但有点类似于 strace,但它不会打印系统调用和信号,而是创建一个“Undo 录制”。然后你可以调试录制中捕获的失败(远比分析核心转储高效!)。这些录制也可以与其他工作人员共享,并可以使用可逆调试器进行重放,以进一步调查崩溃原因或其他问题。

Undo 引擎支持以下 Linux 发行版:

  • Red Hat Enterprise Linux 6.8、6.9、6.10、7.4、7.5、7.6 和 8.0
  • Fedora 28、29 和 30
  • SuSE Linux Enterprise Server 12.3、12.4 和 15
  • Ubuntu 16.04 LTS、18.04 LTS、18.10 和 19.04

Undo 是一家快速发展的,有风险投资支持的技术初创公司,它的总部位于旧金山和英国剑桥。他们称 Live Recorder 可以 100% 确定导致任何软件故障的因素 —— 即使在最复杂的软件环境中也是如此。

FacebookLinkedIn 上加入 Network World 社区,评论你想说的话题。


via: https://www.networkworld.com/article/3405584/undo-releases-live-recorder-5-0-for-linux-debugging.html

作者:Sandra Henry-Stocker 选题:lujun9972 译者:geekpi 校对:wxy

本文由 LCTT 原创编译,Linux中国 荣誉推出

Linux 上的内存管理很复杂。尽管使用率高但未必存在问题。你也应当关注一些其他的事情。

在 Linux 上用光内存通常并不意味着存在严重的问题。为什么?因为健康的 Linux 系统会在内存中缓存磁盘活动,基本上占用掉了未被使用的内存,这显然是一件好事情。

换句话说,它不让内存浪费掉。使用空闲的内存增加磁盘访问速度,并且不占用运行中应用程序的内存。你也能够想到,使用这种内存缓存比起直接访问硬盘驱动器(HDD)快上数百倍,也比明显快于直接访问固态硬盘驱动。内存占满或几乎占满通常意味着系统正在尽可能高效地运行当中 —— 并不是运行中遇到了问题。

缓存如何工作

磁盘缓存简单地意味着系统充分利用未使用的资源(空闲内存)来加速磁盘读取与写入。应用程序不会失去任何东西,并且大多数时间里能够按需求获得更多的内存。此外,磁盘缓存不会导致应用程序转而使用交换分区。反而,用作磁盘缓存的内存空间当被需要时会立即归还,并且磁盘内容会被更新。

主要和次要的页故障

Linux 系统通过分割物理内存来为进程分配空间,将分割成的块称为“页”,并且映射这些页到每个进程的虚拟内存上。不再会用到的页也许会从内存中移除,尽管相关的进程还在运行。当进程需要一个没有被映射或没在内存中页时,故障便会产生。所以,这个“ 故障 fault ”并不意味着“ 错误 error ”而是“ 不可用 unavailables ”,并且故障在内存管理中扮演者一个重要的角色。

次要故障意味着在内存中的页未分配给请求的进程,或未在内存管理单元中标记为出现。主要故障意味着页没有保留在内存中。

如果你想切身感受一下次要页故障和主要页故障出现的频率,像这样试一下 ps 命令。注意我们要的是与页故障和产生它的命令相关的项。输出中省略了很多行。MINFL 显示出次要故障的数目,而 MAJFL 表示了主要故障的数目。

$ ps -eo min_flt,maj_flt,cmd
 MINFL  MAJFL CMD
230760    150 /usr/lib/systemd/systemd --switched-root --system --deserialize 18
     0      0 [kthreadd]
     0      0 [rcu_gp]
     0      0 [rcu_par_gp]
     0      0 [kworker/0:0H-kblockd]
   ...
   166     20 gpg-agent --homedir /var/lib/fwupd/gnupg --use-standard-socket --daemon
   525      1 /usr/libexec/gvfsd-trash --spawner :1.16 /org/gtk/gvfs/exec_spaw/0
  4966      4 /usr/libexec/gnome-terminal-server
  3617      0 bash
     0      0 [kworker/1:0H-kblockd]
   927      0 gdm-session-worker [pam/gdm-password]

汇报单一进程,你可以尝试这样的命令(LCTT 译注:参数里面的 1 是要查看的进程的 PID):

$ ps -o min_flt,maj_flt 1
 MINFL  MAJFL
230064    150

你也可以添加其他的显示字段,例如进程所有者的 UID 和 GID。

$ ps -o min_flt,maj_flt,cmd,args,uid,gid 1
 MINFL  MAJFL CMD                         COMMAND                       UID   GID
230064    150 /usr/lib/systemd/systemd -- /usr/lib/systemd/systemd --     0     0

多少才算满?

一种较好的方法来掌握内存究竟使用了多少是用 free -m 命令。-m 选项指定了数字的单位是 MiB mebibyte 而不是字节。

$ free -m
              total        used        free      shared  buff/cache   available
Mem:           3244        3069          35          49         140         667
Swap:          3535           0        3535

注意 free(未使用)的内存可能会不足,而 available(可用于启动新的应用)会显示更大的数量。这两者的区别值得我们去关注。 可用 available 意味着它可以在需要时恢复使用,而 空闲 free 意味着现在就能够使用。

什么时候要担心

如果 Linux 系统上的性能表现良好 —— 应用程序响应度高,命令行没有显示出问题 —— 很可能系统状况良好。记住,一些应用也许会出于某种原因而变慢,但它不影响整个系统。

过多的硬故障也许表明确实存在问题,但要将其与观察到的性能相比较。

一个好的方法是当可用内存接近 0 或者“ 用作交换 swap used ”项显著增长或波动时开始担心。如果“可用”项占总内存可用量的百分比合理,那么就无需担心,就像下面的例子那样:

$ free -m
              total        used        free      shared  buff/cache   available
Mem:           3244        3069          35          49         140         667
Swap:          3535           0        3535

Linux 性能很复杂

抛开这些不说,Linux 系统上的内存可能会变满,并且性能可能会降低。当系统出现问题时不要仅将单一的内存使用报告作为指标。

Linux 系统的内存管理很复杂,因为它采取的措施需要确保系统资源得到最好的利用。不要受到一开始内存占满的欺骗,使你认为系统存在问题,但实际上并没有。


via: https://www.networkworld.com/article/3394603/when-to-be-concerned-about-memory-levels-on-linux.html

作者:Sandra Henry-Stocker 选题:lujun9972 译者:LuuMing 校对:wxy

本文由 LCTT 原创编译,Linux中国 荣誉推出

Linux 提供了几个可以让你通过终端发送电子邮件的命令,下面来展示一些有趣的方法。

Molnia/iStock

Linux 可以用多种方式通过命令行发送电子邮件。有一些方法十分简单,有一些相对会复杂一些,不过仍旧提供了很多有用的特性。选择哪一种方式取决于你想要什么 —— 向同事快速发送消息,还是向一批人群发带有附件的更复杂的信息。接下来看一看几种可行方案:

mail

发送一条简单消息最便捷的 Linux 命令是 mail。假设你需要提醒老板你今天得早点走,你可以使用这样的一条命令:

$ echo "Reminder: Leaving at 4 PM today" | mail -s "early departure" myboss

另一种方式是从一个文件中提取出你想要发送的文本信息:

$ mail -s "Reminder:Leaving early" myboss < reason4leaving

在以上两种情况中,你都可以通过 -s 来为邮件添加标题。

sendmail

使用 sendmail 命令可以发送一封不包含标题的快信。(用目标收件人替换 recip):

$ echo "leaving now" | sendmail recip

你可以用这条命令发送一条只有标题,没有内容的信息:

$ echo "Subject: leaving now" | sendmail recip

你也可以用 sendmail 发送一条包含一条标题行的完整信息。不过使用这个方法时,你的标题行会被添加到要发送的文件中,如下例所示:

Subject: Requested lyrics
I would just like to say that, in my opinion, longer hair and other flamboyant
affectations of appearance are nothing more ...

你也可以发送这样的文件(lyric 文件包含标题和正文):

$ sendmail recip < lyrics

sendmain 的输出也可以很冗长。如果你感到好奇并希望查看发送系统和接收系统之间的交互,请添加 -v (verbose)选项。

$ sendmail -v [email protected] < lyrics

mutt

mutt 是通过命令行发送邮件的一个很好的工具,在使用前你需要安装它。mutt 的一个很方便的优势就是它允许你在邮件中添加附件。

使用 mutt 发送一条快速信息:

$ echo "Please check last night's backups" | mutt -s "backup check" recip

从文件中获取内容:

$ mutt -s "Agenda" recip < agenda

使用 -a 选项在 mutt 中添加附件。你甚至可以添加不止一个附件 —— 如下一条命令所示:

$ mutt -s "Agenda" recip -a agenda -a speakers < msg

在以上的命令中,msg 文件包含了邮件中的正文。如果你没有其他补充的内容,你可以这样来代替之前的命令:

$ echo "" | mutt -s "Agenda" recip -a agenda -a speakers

mutt 另一个有用的功能是可以添加抄送(-c)和密送(-b)。

$ mutt -s "Minutes from last meeting" [email protected] -c myboss < mins

telnet

如果你想深入了解发送电子邮件的细节,你可以使用 telnet 来进行电子邮件交互操作。但正如所说的那样,你需要“学习术语”。邮件服务器期望一系列命令,其中包括自我介绍(EHLO 命令)、提供发件人(MAIL FROM 命令)、指定收件人(RCPT TO 命令),然后添加消息(DATA)并以 . 结束消息。并不是所有的电子邮件服务器都会响应这些请求。此方法通常仅用于故障排除。

$ telnet emailsite.org 25
Trying 192.168.0.12...
Connected to emailsite.
Escape character is '^]'.
220 localhost ESMTP Sendmail 8.15.2/8.15.2/Debian-12; Wed, 12 Jun 2019 16:32:13 -0400; (No UCE/UBE) logging access from: mysite(OK)-mysite [192.168.0.12]
EHLO mysite.org                <== introduce yourself
250-localhost Hello mysite [127.0.0.1], pleased to meet you
250-ENHANCEDSTATUSCODES
250-PIPELINING
250-EXPN
250-VERB
250-8BITMIME
250-SIZE
250-DSN
250-ETRN
250-AUTH DIGEST-MD5 CRAM-MD5
250-DELIVERBY
250 HELP
MAIL FROM: [email protected]       <== 指定发件人
250 2.1.0 [email protected]... Sender ok
RCPT TO: recip             <== 指定收件人
250 2.1.5 recip... Recipient ok
DATA                   <== 邮件内容开始
354 Enter mail, end with "." on a line by itself
This is a test message. Please deliver it for me.
.                  <== 内容结束
250 2.0.0 x5CKWDds029287 Message accepted for delivery
quit                   <== 结束交互

向多个收件人发送电子邮件

如果你希望通过 Linux 命令行向一大组收件人发送电子邮件,你可以使用一个循环来帮助你完成任务,如下面应用在 mutt 中的例子:

$ for recip in `cat recips`
do
    mutt -s "Minutes from May meeting" $recip < May_minutes
done

总结

有很多方法可以从 Linux 命令行发送电子邮件。有些工具提供了相当多的选项。


via: https://www.networkworld.com/article/3402027/how-to-send-email-from-the-linux-command-line.html

作者:Sandra Henry-Stocker 选题:lujun9972 译者:Modrisco 校对:wxy

本文由 LCTT 原创编译,Linux中国 荣誉推出

Linux 系统在运行时数据方面的工作方式发生了微小但重大的变化。

如果你没有密切关注,你可能没有注意到 Linux 系统在运行时数据方面的工作方式有一些小但重大的变化。 它重新组织了文件系统中可访问的方式和位置,而这个变化在大约八年前就开始了。虽然这种变化可能不足以让你的袜子变湿,但它在 Linux 文件系统中提供了更多一致性,值得进行一些探索。

要开始,请转到 /run。如果你使用 df 来检查它,你会看到这样的输出:

$ df -k .
Filesystem     1K-blocks  Used Available Use% Mounted on
tmpfs             609984  2604    607380   1% /run

它被识别为 “tmpfs”(临时文件系统),因此我们知道 /run 中的文件和目录没有存储在磁盘上,而只存储在内存中。它们表示保存在内存(或基于磁盘的交换空间)中的数据,它看起来像是一个已挂载的文件系统,这个可以使其更易于访问和管理。

/run 是各种各样数据的家园。例如,如果你查看 /run/user,你会注意到一组带有数字名称的目录。

$ ls /run/user
1000  1002  121

使用长文件列表可以发现这些数字的重要性。

$ ls -l
total 0
drwx------ 5 shs  shs  120 Jun 16 12:44 1000
drwx------ 5 dory dory 120 Jun 16 16:14 1002
drwx------ 8 gdm  gdm  220 Jun 14 12:18 121

我们看到每个目录与当前登录的用户或显示管理器 gdm 相关。数字代表他们的 UID。每个目录的内容都是运行中的进程所使用的文件。

/run/user 文件只是你在 /run 中找到的一小部分。还有很多其他文件。有一些文件包含了各种系统进程的进程 ID。

$ ls *.pid
acpid.pid  atopacctd.pid  crond.pid  rsyslogd.pid
atd.pid    atop.pid       gdm3.pid   sshd.pid

如下所示,上面列出的 sshd.pid 文件包含 ssh 守护程序(sshd)的进程 ID。

$ cat sshd.pid
1148
$ ps -ef | grep sshd
root      1148     1  0 Jun14 ?        00:00:00 /usr/sbin/sshd -D    <==
root     10784  1148  0 12:44 ?        00:00:00 sshd: shs [priv]
shs      10922 10784  0 12:44 ?        00:00:00 sshd: shs@pts/0
root     18109  1148  0 16:13 ?        00:00:00 sshd: dory [priv]
dory     18232 18109  0 16:14 ?        00:00:00 sshd: dory@pts/1
shs      19276 10923  0 16:50 pts/0    00:00:00 grep --color=auto sshd

/run 中的某些子目录只能使用 root 权限访问,例如 /run/sudo。例如,以 root 身份运行我们可以看到一些与真实或尝试使用 sudo 相关的文件:

/run/sudo/ts# ls -l
total 8
-rw------- 1 root dory 112 Jun 16 16:37 dory
-rw------- 1 root shs  168 Jun 17 08:33 shs

为了与 /run 的变化保持一致,一些运行时数据的旧位置现在是符号链接。/var/run 现在是指向 /run 的指针,/var/lock 指向 /run/lock 的指针,可以保证旧的引用按预期工作。

$ ls -l /var
total 52
drwxr-xr-x  2 root root     4096 Jun 17 07:36 backups
drwxr-xr-x 19 root root     4096 Apr 18 13:46 cache
drwxrwsrwt  2 root whoopsie 4096 Jun 13 07:39 crash
drwxr-xr-x 75 root root     4096 Jun  9 15:14 lib
drwxrwsr-x  2 root staff    4096 Oct 16  2017 local
lrwxrwxrwx  1 root root        9 May 14  2018 lock -> /run/lock
drwxrwxr-x 17 root syslog   4096 Jun 17 00:00 log
drwxrwsrwt  2 root mail     4096 Jun 13 12:10 mail
drwxrwsrwt  2 root whoopsie 4096 Jan  5  2018 metrics
drwxr-xr-x  2 root root     4096 Jan  5  2018 opt
lrwxrwxrwx  1 root root        4 May 14  2018 run -> /run
drwxr-xr-x  9 root root     4096 Jun 16  2018 snap
drwxr-xr-x  9 root root     4096 Jun  9 15:14 spool
drwxrwxrwt  8 root root     4096 Jun 17 00:00 tmp
drwxr-xr-x  3 root root     4096 Jan 19 12:14 www

虽然技术上的变化很小,但转换到使用 /run 只是为了在 Linux 文件系统中更好地组织运行时数据。


via: https://www.networkworld.com/article/3403023/exploring-run-on-linux.html

作者:Sandra Henry-Stocker 选题:lujun9972 译者:wxy 校对:wxy

本文由 LCTT 原创编译,Linux中国 荣誉推出

无论你是纠结一个难以理解的单词,还是在将报告发给老板之前再检查一遍,Linux 都可以帮助你解决拼写问题。

Linux 为数据分析和自动化提供了各种工具,它也帮助我们解决了一个一直都在纠结的问题 —— 拼写!无论在写每周报告时努力拼出一个单词,还是在提交商业计划书之前想要借助计算机的“眼睛”来找出你的拼写错误。现在我们来看一下它是如何帮助你的。

look

look 是其中一款工具。如果你知道一个单词的开头,你就可以用这个命令来获取以这些字母开头的单词列表。除非提供了替代词源,否则 look 将使用 /usr/share/dict/words 中的内容来为你标识单词。这个文件有数十万个单词,可以满足我们日常使用的大多数英语单词的需要,但是它可能不包含我们计算机领域中的一些人倾向于使用的更加生僻的单词,如 zettabyte。

look 命令的语法非常简单。输入 look word ,它将遍历单词文件中的所有单词并找到匹配项。

$ look amelio
ameliorable
ameliorableness
ameliorant
ameliorate
ameliorated
ameliorates
ameliorating
amelioration
ameliorations
ameliorativ
ameliorative
amelioratively
ameliorator
amelioratory

如果你遇到系统中单词列表中未包含的单词,将无法获得任何输出。

$ look zetta
$

如果你没有看到你所希望出现的单词,也不要绝望。你可以在你的单词文件中添加单词,甚至引用一个完全不同的单词列表,在网上找一个或者干脆自己创建一个。你甚至不必将添加的单词放在按字母顺序排列的正确位置;只需将其添加到文件的末尾即可。但是,你必须以 root 用户身份执行此操作。例如(要注意 >>!):

# echo “zettabyte” >> /usr/share/dict/words

当使用不同的单词列表时,例如这个例子中的 “jargon” ,你只需要添加文件的名称。如果不采用默认文件时,请使用完整路径。

$ look nybble /usr/share/dict/jargon
nybble
nybbles

look 命令大小写不敏感,因此你不必关心要查找的单词是否应该大写。

$ look zet
ZETA
Zeta
zeta
zetacism
Zetana
zetas
Zetes
zetetic
Zethar
Zethus
Zetland
Zetta

当然,不是所有的单词列表都是一样的。一些 Linux 发行版在单词文件中提供了多得多的内容。你的文件中可能有十万或者更多倍的单词。

在我的一个 Linux 系统中:

$ wc -l /usr/share/dict/words
102402 /usr/share/dict/words

在另一个系统中:

$ wc -l /usr/share/dict/words
479828 /usr/share/dict/words

请记住,look 命令只适用于通过单词开头查找,但如果你不想从单词的开头查找,还可以使用其他选项。

grep

我们深爱的 grep 命令像其他工具一样可以从一个单词文件中选出单词。如果你正在找以某些字母开头或结尾的单词,使用 grep 命令是自然而然的事情。它可以通过单词的开头、结尾或中间部分来匹配单词。系统中的单词文件可以像使用 look 命令时在 grep 命令中轻松使用。不过唯一的缺点是你需要指定文件,这一点与 look 不尽相同。

在单词的开头前加上 ^

$ grep ^terra /usr/share/dict/words
terrace
terrace's
terraced
terraces
terracing
terrain
terrain's
terrains
terrapin
terrapin's
terrapins
terraria
terrarium
terrarium's
terrariums

在单词的结尾后加上 $

$ grep bytes$ /usr/share/dict/words
bytes
gigabytes
kilobytes
megabytes
terabytes

使用 grep 时,你需要考虑大小写,不过 grep 命令也提供了一些选项。

$ grep ^[Zz]et /usr/share/dict/words
Zeta
zeta
zetacism
Zetana
zetas
Zetes
zetetic
Zethar
Zethus
Zetland
Zetta
zettabyte

为单词文件添加软连接能使这种搜索方式更加便捷:

$ ln -s /usr/share/dict/words words
$ grep ^[Zz]et words
Zeta
zeta
zetacism
Zetana
zetas
Zetes
zetetic
Zethar
Zethus
Zetland
Zetta
zettabytye

aspell

aspell 命令提供了一种不同的方式。它提供了一种方法来检查你提供给它的任何文件或文本的拼写。你可以通过管道将文本传递给它,然后它会告诉你哪些单词看起来有拼写错误。如果所有单词都拼写正确,则不会有任何输出。

$ echo Did I mispell that? | aspell list
mispell
$ echo I can hardly wait to try out aspell | aspell list
aspell
$ echo Did I misspell anything? | aspell list
$

list 参数告诉 aspell 为标准输入单词提供拼写错误的单词列表。

你还可以使用 aspell 来定位和更正文本文件中的单词。如果它发现一个拼写错误的单词,它将为你提供一个相似(但拼写正确的)单词列表来替换这个单词,你也可以将该单词加入个人词库(~/.aspell.en.pws)并忽略拼写错误,或者完全中止进程(使文件保持处理前的状态)。

$ aspell -c mytext

一旦 aspell 发现一个单词出现了拼写错误,它将会为不正确的 “mispell” 提供一个选项列表:

1) mi spell                             6) misplay
2) mi-spell                             7) spell
3) misspell                             8) misapply
4) Ispell                               9) Aspell
5) misspells                            0) dispel
i) Ignore                               I) Ignore all
r) Replace                              R) Replace all
a) Add                                  l) Add Lower
b) Abort                                x) Exit

请注意,备选单词和拼写是数字编号的,而其他选项是由字母选项表示的。你可以选择备选拼写中的一项或者自己输入替换项。“Abort” 选项将使文件保持不变,即使你已经为某些单词选择了替换。你选择添加的单词将被插入到本地单词文件中(例如 ~/.aspell.en.pws)。

其他单词列表

厌倦了英语? aspell 命令可以在其他语言中使用,只要你添加了相关语言的单词列表。例如,在 Debian 系统中添加法语的词库,你可以这样做:

$ sudo apt install aspell-fr

这个新的词库文件会被安装为 /usr/share/dict/French。为了使用它,你只需要简单地告诉 aspell 你想要使用替换的单词列表:

$ aspell --lang=fr -c mytext

这种情况下,当 aspell 读到单词 “one” 时,你可能会看到下面的情况:

1) once                                 6) orné
2) onde                                 7) ne
3) ondé                                 8) né
4) onze                                 9) on
5) orne                                 0) cône
i) Ignore                               I) Ignore all
r) Replace                              R) Replace all
a) Add                                  l) Add Lower
b) Abort                                x) Exit

你也可以从 GNU 官网获取其他语言的词库。

总结

即使你是全国拼字比赛的冠军,你可能偶尔也会需要一点拼写方面的帮助,哪怕只是为了找出你手滑打错的单词。aspell 工具,加上 lookgrep 命令已经准备来助你一臂之力了。


via: https://www.networkworld.com/article/3400942/how-linux-can-help-with-your-spelling.html

作者:Sandra Henry-Stocker 选题:lujun9972 译者:Modrisco 校对:wxy

本文由 LCTT 原创编译,Linux中国 荣誉推出

有时文件副本相当于对硬盘空间的巨大浪费,并会在你想要更新文件时造成困扰。以下是用来识别这些文件的六个命令。

Vinoth Chandar (CC BY 2.0)

在最近的帖子中,我们看了如何识别并定位硬链接的文件(即,指向同一硬盘内容并共享 inode)。在本文中,我们将查看能找到具有相同内容,却不相链接的文件的命令。

硬链接很有用是因为它们能够使文件存放在文件系统内的多个地方却不会占用额外的硬盘空间。另一方面,有时文件副本相当于对硬盘空间的巨大浪费,在你想要更新文件时也会有造成困扰之虞。在本文中,我们将看一下多种识别这些文件的方式。

用 diff 命令比较文件

可能比较两个文件最简单的方法是使用 diff 命令。输出会显示你文件的不同之处。<> 符号代表在当参数传过来的第一个(<)或第二个(>)文件中是否有额外的文字行。在这个例子中,在 backup.html 中有额外的文字行。

$ diff index.html backup.html
2438a2439,2441
> <pre>
> That's all there is to report.
> </pre>

如果 diff 没有输出那代表两个文件相同。

$ diff home.html index.html
$

diff 的唯一缺点是它一次只能比较两个文件并且你必须指定用来比较的文件,这篇帖子中的一些命令可以为你找到多个重复文件。

使用校验和

cksum(checksum) 命令计算文件的校验和。校验和是一种将文字内容转化成一个长数字(例如2819078353 228029)的数学简化。虽然校验和并不是完全独有的,但是文件内容不同校验和却相同的概率微乎其微。

$ cksum *.html
2819078353 228029 backup.html
4073570409 227985 home.html
4073570409 227985 index.html

在上述示例中,你可以看到产生同样校验和的第二个和第三个文件是如何可以被默认为相同的。

使用 find 命令

虽然 find 命令并没有寻找重复文件的选项,它依然可以被用来通过名字或类型寻找文件并运行 cksum 命令。例如:

$ find . -name "*.html" -exec cksum {} \;
4073570409 227985 ./home.html
2819078353 228029 ./backup.html
4073570409 227985 ./index.html

使用 fslint 命令

fslint 命令可以被特地用来寻找重复文件。注意我们给了它一个起始位置。如果它需要遍历相当多的文件,这就需要花点时间来完成。注意它是如何列出重复文件并寻找其它问题的,比如空目录和坏 ID。

$ fslint .
-----------------------------------file name lint
-------------------------------Invalid utf8 names
-----------------------------------file case lint
----------------------------------DUPlicate files   <==
home.html
index.html
-----------------------------------Dangling links
--------------------redundant characters in links
------------------------------------suspect links
--------------------------------Empty Directories
./.gnupg
----------------------------------Temporary Files
----------------------duplicate/conflicting Names
------------------------------------------Bad ids
-------------------------Non Stripped executables

你可能需要在你的系统上安装 fslint。你可能也需要将它加入你的命令搜索路径:

$ export PATH=$PATH:/usr/share/fslint/fslint

使用 rdfind 命令

rdfind 命令也会寻找重复(相同内容的)文件。它的名字意即“重复数据搜寻”,并且它能够基于文件日期判断哪个文件是原件——这在你选择删除副本时很有用因为它会移除较新的文件。

$ rdfind ~
Now scanning "/home/shark", found 12 files.
Now have 12 files in total.
Removed 1 files due to nonunique device and inode.
Total size is 699498 bytes or 683 KiB
Removed 9 files due to unique sizes from list.2 files left.
Now eliminating candidates based on first bytes:removed 0 files from list.2 files left.
Now eliminating candidates based on last bytes:removed 0 files from list.2 files left.
Now eliminating candidates based on sha1 checksum:removed 0 files from list.2 files left.
It seems like you have 2 files that are not unique
Totally, 223 KiB can be reduced.
Now making results file results.txt

你可以在 dryrun 模式中运行这个命令 (换句话说,仅仅汇报可能会另外被做出的改动)。

$ rdfind -dryrun true ~
(DRYRUN MODE) Now scanning "/home/shark", found 12 files.
(DRYRUN MODE) Now have 12 files in total.
(DRYRUN MODE) Removed 1 files due to nonunique device and inode.
(DRYRUN MODE) Total size is 699352 bytes or 683 KiB
Removed 9 files due to unique sizes from list.2 files left.
(DRYRUN MODE) Now eliminating candidates based on first bytes:removed 0 files from list.2 files left.
(DRYRUN MODE) Now eliminating candidates based on last bytes:removed 0 files from list.2 files left.
(DRYRUN MODE) Now eliminating candidates based on sha1 checksum:removed 0 files from list.2 files left.
(DRYRUN MODE) It seems like you have 2 files that are not unique
(DRYRUN MODE) Totally, 223 KiB can be reduced.
(DRYRUN MODE) Now making results file results.txt

rdfind 命令同样提供了类似忽略空文档(-ignoreempty)和跟踪符号链接(-followsymlinks)的功能。查看 man 页面获取解释。

-ignoreempty       ignore empty files
-minsize        ignore files smaller than speficied size
-followsymlinks     follow symbolic links
-removeidentinode   remove files referring to identical inode
-checksum       identify checksum type to be used
-deterministic      determiness how to sort files
-makesymlinks       turn duplicate files into symbolic links
-makehardlinks      replace duplicate files with hard links
-makeresultsfile    create a results file in the current directory
-outputname     provide name for results file
-deleteduplicates   delete/unlink duplicate files
-sleep          set sleep time between reading files (milliseconds)
-n, -dryrun     display what would have been done, but don't do it

注意 rdfind 命令提供了 -deleteduplicates true 的设置选项以删除副本。希望这个命令语法上的小问题不会惹恼你。;-)

$ rdfind -deleteduplicates true .
...
Deleted 1 files.    <==

你将可能需要在你的系统上安装 rdfind 命令。试验它以熟悉如何使用它可能是一个好主意。

使用 fdupes 命令

fdupes 命令同样使得识别重复文件变得简单。它同时提供了大量有用的选项——例如用来迭代的 -r。在这个例子中,它像这样将重复文件分组到一起:

$ fdupes ~
/home/shs/UPGRADE
/home/shs/mytwin

/home/shs/lp.txt
/home/shs/lp.man

/home/shs/penguin.png
/home/shs/penguin0.png
/home/shs/hideme.png

这是使用迭代的一个例子,注意许多重复文件是重要的(用户的 .bashrc.profile 文件)并且不应被删除。

# fdupes -r /home
/home/shark/home.html
/home/shark/index.html

/home/dory/.bashrc
/home/eel/.bashrc

/home/nemo/.profile
/home/dory/.profile
/home/shark/.profile

/home/nemo/tryme
/home/shs/tryme

/home/shs/arrow.png
/home/shs/PNGs/arrow.png

/home/shs/11/files_11.zip
/home/shs/ERIC/file_11.zip

/home/shs/penguin0.jpg
/home/shs/PNGs/penguin.jpg
/home/shs/PNGs/penguin0.jpg

/home/shs/Sandra_rotated.png
/home/shs/PNGs/Sandra_rotated.png

fdupe 命令的许多选项列如下。使用 fdupes -h 命令或者阅读 man 页面获取详情。

-r --recurse     recurse
-R --recurse:    recurse through specified directories
-s --symlinks    follow symlinked directories
-H --hardlinks   treat hard links as duplicates
-n --noempty     ignore empty files
-f --omitfirst   omit the first file in each set of matches
-A --nohidden    ignore hidden files
-1 --sameline    list matches on a single line
-S --size        show size of duplicate files
-m --summarize   summarize duplicate files information
-q --quiet       hide progress indicator
-d --delete      prompt user for files to preserve
-N --noprompt    when used with --delete, preserve the first file in set
-I --immediate   delete duplicates as they are encountered
-p --permissions don't soncider files with different owner/group or
                 permission bits as duplicates
-o --order=WORD  order files according to specification
-i --reverse     reverse order while sorting
-v --version     display fdupes version
-h --help        displays help

fdupes 命令是另一个你可能需要安装并使用一段时间才能熟悉其众多选项的命令。

总结

Linux 系统提供能够定位并(潜在地)能移除重复文件的一系列的好工具,以及能让你指定搜索区域及当对你所发现的重复文件时的处理方式的选项。


via: https://www.networkworld.com/article/3390204/how-to-identify-same-content-files-on-linux.html#tk.rss_all

作者:Sandra Henry-Stocker 选题:lujun9972 译者:tomjlw 校对:wxy

本文由 LCTT 原创编译,Linux中国 荣誉推出