两美分技巧

作者:Marjorie Richardson

作为一名 Linux 新用户,我发现自己很难在文件系统中找到方向。我知道有 find 命令,但是记住所有使其在正确的位置搜索、找到正确的文件并打印正确答案的选项,对我来说一开始是不可能的。所以我使用 shell 脚本创建了自己的命令,并将其命名为 fnd

fnd 接受一个参数,即您要查找的文件名,可以包含您希望包含的任何通配符,并将其输出通过管道传递给 less,然后您就可以查看大量结果列表。您在每行输出中获得的是您要查找的任何文件的完整路径。我发现它非常有用(就像粗略熟悉 less 命令一样)。这是我的脚本

!/bin/bash
find / -iname $1 -mount -print |less

就是这样。 -iname 选项告诉 find 命令不区分大小写,$1 是一个变量,它替换您的命令行参数,-mount 告诉 find 不要搜索其他文件系统(如您的 CD-ROM)上的目录(因为我的 CD-ROM 有问题,如果访问它会锁定机器)。 -print 选项是必需的,否则您不会得到任何输出。(习惯它,这是 *nix。)|(管道)符号告诉 find 将其输出定向到 less 命令,以便您可以时尚地查看结果。 不要忘记在 find 命令后紧跟 /,否则它将不知道在哪里查找。 享受吧。 您不会后悔花时间输入这个小快捷方式,并且不要忘记在使用 chmod 使其可执行后将其放在 bin 或 sbin 目录中。 —Jim Murphymurphyc@cadvision.com

X Term 标题栏功能

在第 9 期邮件中,Jim Murphy 说 find-print 选项是获取 find 命令输出所必需的,并补充说“习惯它,这是 *nix。” 嗯,他说的对了一半。 Linux 确实需要这个。 但是,任何在其他 Unix 机器上工作的用户都会发现一些常见的 CLI(命令行界面)命令存在细微差异。 例如,Solaris 上的 find 不需要 -print 选项即可获得输出。 只是发人深省。

其次,我有一个 xterm 标题栏功能,人们可能会觉得有用。 我将首先给出代码,然后解释它的作用。

在您的 .bashrc(或 .kshrc—请注意,这仅适用于 ksh 风格的 shell)中添加以下内容

HOSTNAME=`uname -n`
if [ "$TERM" = x"term" ] && [ "$0" =
"-bash"]
then<\n>
  ilabel () { echo -n "^[]1;$*^G"; }
  label () { echo -n ^"[]2;$*^G"; }
  alias stripe='label $HOSTNAME - ${PWD#$HOME/}'
  alias stripe2='label $HOSTNAME - vi $*'
  cds () { "cd" $*; eval stripe; }
  vis () { eval stripe2; "vi" $*; eval stripe;}
  alias cd=cds
  alias vi=vis
  eval stripe
  eval ilabel "$HOSTNAME"
fi

这做了三件事(只要您在 xterm 中并运行 bash)

  1. 当 xterm 首次打开时,当前主机的名称会显示在标题栏中。

  2. 当您更改目录(使用 cd)时,当前路径会显示在 xterm 标题栏中,用户的 $HOME 目录从路径的前端剥离(当您在自己的目录树中的某个位置时,可以节省一些空间)。路径前面是当前主机的网络名称。

  3. 当您使用 vi 编辑文件时,文件名会与当前主机名一起显示在标题栏中。 当您退出 vi 会话时,标题栏会恢复为上面第 2 点中描述的主机名/路径格式。

我发现这对于我的所有基于 ksh 的系统都非常有用,因为它从我的 shell 提示符中删除了路径,从而为我节省了提示符命令的空间。 由于 bash 是 ksh 兼容的 shell,因此这在标准 Linux 系统上运行良好。 —Michael J. Hammelmjhammel@csn.net

Find 和替代方案

在第 9 期中看到了 Jim Murphy 的 find 技巧,并认为您可能会喜欢一种更快的方法。 我不了解其他发行版,但 Slackware 和 Red Hat 都带有 GNU 版本的 locate(1)updatedb(1),它们使用索引来查找您想要的文件。 updatedb(1) 程序应该每天晚上从 crontab 工具运行一次。 要忽略某些子目录(例如您的 /cdrom),请使用以下 crontab 文件语法

41 5 * * * updatedb --prunepaths="/tmp /var \
        /proc /cdrom" > /dev/null 2>&1

此命令将在每天早上 5:41 AM 运行,并使用除列出的子目录(以及下面的子目录)之外的所有位置的文件名更新数据库。

要定位文件,只需键入 locate 文件名。 文件名不必完整; locate 也可以进行部分匹配。 对我来说,搜索通常只需要几秒钟,而且我有数万个文件。

locate(1) 命令也具有正则表达式匹配,但我经常通过管道将其传递给 agrep(1)(更快的 grep)以缩小搜索范围。 因此

locate locate | agrep -v man

将排除 man 手册页,并且如果我在线,则仅向我显示二进制文件和源文件。(-v 标志排除用作参数的模式。)要仅获取二进制文件以及完整的目录列表,请使用以下命令

ls -l `locate locate | agrep bin`

find(1) 命令是一个很棒的“瑞士军刀”(实际上,一旦您习惯了它,它就没那么糟糕了),但是对于 90% 您只想按文件名搜索的情况,locate(1) 命令要快得多,而且更容易使用。 —Bill Duncan, VE3IEDbduncan@ve3ied.uucp

加载 Disqus 评论