Linux:文件命令精通指南

  虽然 GUI 桌面(如 KDE 和 GNOME)能够帮助用户利用 Linux 特性,而无需关于命令行接口的功能知识,但还是经常会需要更多的功能和灵活性。而且,基本熟悉这些命令对于在 shell 脚本中正确地使某些功能自动化仍然是必需的。

  这篇文章是关于 Linux 文件命令的一个“速成教程”,它是为那些刚接触这个操作系统或者只是需要补充这方面知识的用户提供的。它包含了对一些更有用的命令的一个简明的概述以及关于它们的最强大的应用的指导。下面包含的信息 — 结合一些实验 — 将使您能够容易地掌握这些基本的命令。(注意:当涉及到一个与 Oracle 集群文件系统 (OCFS) 结合的内核时,这些命令中的某些命令的行为可能会稍微有所不同。在此情况下,Oracle 提供了一个 OCFS 工具集,该工具集可以为文件命令应用提供一个更好的选择。)

  注意,这里包含的所有示例都在 SUSE Linux 8.0 Professional 上进行了测试。虽然没有理由相信它们在其它的系统上将不能工作,但如果出现问题,您应当查看您的文档,以了解可能的变化。

  背景概念

  在深入研究规范之前,让我们回顾一些基础知识。

  文件和命令

  在 Linux/UNIX 操作系统中,所有事物都被当作文件来处理:硬件设备(包括键盘和终端)、目录、命令本身,当然还有文件。这个奇怪的惯例实际上是 Linux/UNIX 的能力和灵活性的基础。

  大多数(几乎是全部)的命令形式如下:

  command [option] [source file(s)] [target file]

  获取帮助

  最有用的命令之一是那些提供帮助的命令(特别是对那些学习 Linux 的人而言)。Linux 中的两个重要的信息来源是联机参考手册,或 man 页面和 whatis 工具。您可以用 whatis 命令来访问一个不熟悉的命令的 man 页面。

  $ whatis echo

  要了解关于这个命令的更多信息,可以使用:

  $ man echo

  如果您不知道某个特殊任务所需的命令,您可以用 man -k (也称为 apropos)和一个主题来生成可能的命令。例如:

  $ man -k files

  一个很有用但常常被忽视的命令可以提供关于使用 man 本身的信息:

  $ man man

  您可以用 SPACEBAR 来浏览任意的 man 页面;UP ARROW 将向上翻滚文件。.要退出,则输入 q,!,或 CTRL-Z。

  用户类别

  记得那句名言“所有动物一例平等但有些动物比其他动物更加平等”吗?在 Linux 世界中,根用户掌管一切。

  根用户可以以另一个用户名 su (源自 'superuser')登录。要执行诸如添加一个新用户、打印机或文件系统之类的任务,必须作为根用户登录或者用 su 命令和根用户密码切换到超级用户。系统文件(包括控制初始化过程的系统文件)归根用户所有。虽然可能允许普通用户对它们进行读操作,但出于系统安全性的原因,编辑的权利将留给根用户。

  BASH shell

  虽然提供了其它的 shell,但 BASH (Bourne Again Shell) 是 Linux 的默认 shell。它结合了与它同名的 Bourne shell 的特性和 Korn、C 和 TCSH shell 的特性。

  BASH 内置的命令 history 默认记录最后输入的 500 条命令。可以通过在命令提示符下输入 history 来查看它们。要检索某个特定的命令,可以在命令提示符下按 UP ARROW 或 DOWN ARROW,或在历史列表中输入它的编号,并在编号前面加上 '!',例如:

  $ !49

  您还可以通过一条命令在历史列表中离位置最靠前的项目的距离来执行该命令:如果在历史列表中有 53 个事件,$ !-3 将执行事件号 51。

  像 UNIX/Linux 世界的其它 shell 一样,BASH 使用了特殊的环境变量来方便系统管理。例如:

  HOME,用户主目录

  PATH,Linux 用来搜索您输入的命令的可执行镜像的搜索路径

  HISTSIZE,系统保存的历史事件的数量

  除了这些保留的关键字之外,您还可以定义您自己的环境变量。例如,Oracle 使用 ORACLE_HOME (还有其它一些变量),要使 Oracle 安装成功完成,必须在您的环境中设置这些变量。

  可以在提示符下临时设置变量:

  $HISTSIZE=100

  或者,在 /etc/profile (需要根用户权限)中进行系统范围的永久设置,或在 .profile 中进行局部永久设置。

  可以通过 echo 命令,并用一个 $ 符号来访问一个环境变量的值,进而查看该值。

  $ echo $HOME
  /home/bluher

  可以用 env 命令来查看当前所有的环境变量。

  正则表达式和通配符

  许多 Linux 命令使用通配符 * 和 ? 来匹配任意数量的字符或分别匹配任意的单个字符;正则模式匹配表达式利用一个句点 (.) 来匹配除“换行符”之外的任意单个字符。这两种情况下都使用方括号 ([ ]) 来匹配除“*”号之外的字符组。不过,* 号在各种情况下有类似但不同的意义:虽然它在 shell 中将匹配一个或更多的字符,但在正则表达式中,它匹配上述字符的零个或更多的实例。一些命令(如 egrep 和 awk)使用了一组更广泛的特殊字符来进行模式匹配。

  文件处理命令

  剖析一个文件列表

  ls 命令用来查看用户有执行权限的任意目录中的文件列表,该命令有许多有趣的选项。例如:

  $ ls -liah *
  22684 -rw-r--r-- 1 bluher users 952 Dec 28 18:43 .profile
  19942 -rw-r--r-- 1 scalish users 30 Jan 3 20:00 test2.out
  925 -rwxr-xr-x 1 scalish users 378 Sep 2 2002 test.sh
  

  上面的列表显示 8 列:

  第 1 列指示文件的 inode,因为我们使用了 -i 选项。剩下的列通过 -l 选项来进行正常显示。

  第 2 列显示文件类型和文件访问权限。

  第3 列显示链接数,包括目录。

  第 4 和第 5 列显示文件的所有者和组所有者。这里,所有者 'bluher' 属于组 'users'。

  第 6 列显示文件大小(单位为所显示的单位,而不是默认的字节数,因为我们使用了 -h 选项。

  第 7 列显示日期(它看起来像是三列),包括月、日和年,以及当天的时间。

  第 8 列显示文件名。在选项列表中使用 -a 将使列表中包含隐藏文件(如 .profile)的列表。

  处理文件

  可以移动 (mv)、复制 (cp) 或删除 (rm) 文件和目录。明智地使用 -i 选项,以获得确认通常是个不错的主意。

  $ cp -i ls.out ls2.out

  cp:overwrite `ls2.out'?

  mv 命令允许使用 -b 选项,这将在移动文件之前作一个备份拷贝。rm 和 cp 接受功能强大但却危险的 -r 选项,它将在一个目录和它的文件上递归执行。

  $ rm -ir Test

  rm:descend into directory `Test'? y

  可以用 mkdir 来创建目录,用 rmdir 来删除目录。不过,因为不能用 rmdir 来删除包含文件的目录,所以使用 rm 加 -r 选项通常要更方便些。

  出于安全的原因,所有的文件都有所有权和保护。文件访问权限(或文件模式)包含之前提到的相同的 10 个字符:

  第一个字符指示文件类型。最常见的是 - 代表文件,d 代表目录,而 l 代表链接。

  接下来的 9 个字符是三种用户类别的访问权限:文件所有者(字符 2-4),用户组 (5-7) 和其它 (8-10),其中 r 表示读权限,w 表示写权限,x 指示一个文件上的执行权限。破折号 - 如果出现在这九个位置的任意一个,则指示这个操作对该类别的用户禁止。

  可以使用 chmod 命令通过字符符号或二进制掩码来设置访问权限。要使用二进制掩码,必须将三个权限组的字符表示转换成二进制格式,然后转换成八进制格式:

  用户类别: 所有者 用户组 其它

  字符表示: rwx r-x r--

  二进制表示: 111 101 100

  八进制表示: 7 5 4

  将写权限赋予用户组,您可以使用:

  chmod g+w test.sh or chmod 774 test.sh

  用 umask 命令,在 /etc/init.dev 文件中进行系统范围内的、或在 .profile 文件中进行的本地的文件权限默认设置。这个命令指示用 777 减去这个数字来获取默认的权限:

  $ umask 022

  这将为用户创建的所有新文件生成一个默认的文件权限 755。

  可以用 chown 来修改文件的所有权:

  $ chown bluher ls.out

  这里,bluher 是新的文件所有者。类似地,组成员资格将按以下方式修改:

  $ chgrp devgrp ls.out

  这里,devgrp 是新的用户组。

  ls 不提供哪些文件是文本的,哪些文件是二进制的的信息。要了解这个信息,您可以使用 file * 命令。

  重命名文件

  赋予一个文件多个名字的两种流行的方法是利用链接和 alias 命令。Alias 可以用来为一个更长的命令重新起一个更方便的名字:

  $ alias ll='ls -l'
  $ ll

  注意单引号的使用,这使得 BASH 将该项目传递给别名,而不是自己估计它。别名还可用作较长的路径名的缩写:

  $ alias jdev9i=/jdev9i/jdev/bin/jdev

  关于 alias 和它的反命令 unalias 的更多信息,请查看 BASH 的 man 页面的 'SHELL BUILTIN COMMANDS' 子部分。在最后一个例子中,定义了一个环境变量来实现相同的结果。

  $ export JDEV_HOME=/jdev9i/jdev/bin/jdev
  $ echo $JDEV_HOME
  /jdev9i/jdev/bin/jdev
  $ $JDEV_HOME

  链接允许几个文件名引用单个源文件,格式如下:

  ln [-s] fileyouwanttolinkto newname

  单独的 ln 命令创建到文件的一个硬链接,而使用 -s 选项来创建一个符号链接。简而言之,一个硬链接几乎不能和原始的文件区分开(除了这两个文件的 inode 将相同之外)。符号链接较容易区分,因为它们出现在一个长的文件列表中,并用 -〉 来指示源文件,l 指示文件类型。

  查看和查找文件

  文件过滤器

  用来读取文件内容和在文件内容上执行操作的命令有时被称为 1y滤器。sed 和 awk 命令是两个滤波器的例子,因为在以前的 OTN 文章中有它们详细的讨论,在这里将略过。

  诸如 cat、 more 和 less 之类的命令让您能够从命令行查看一个文本文件的内容,而无需调用编辑器。Cat 是 'concatenate' 的缩写,它将默认地在标准输出(显示屏)上显示文件内容。和 cat 一起提供的最有趣的选项之一是 -n 选项,它用编号的输出行来显示文件内容。

  $ cat -n test.out
  1 This is a test.

  因为 cat 一次性输出文件中的所有行,所以您可能更喜欢用 more 和 less,因为它们都一次输出一屏的文件内容。Less 是 more 的一个增强的版本,它允许用来自 vi 文本编辑器的关键命令来增强文件查看。例如,d 向前翻滚、b 向后翻滚 N 行(如果 N 是在 d 或 b 之前指定的)。为 N 输入的值成为随后的 d 命令的默认值。man 页面实用工具使用 less 来显示使用说明的内容。

  重定向和管道

  重定向允许将命令输出重定向到文件中,而不是标准输出,或者类似地,也可重定向输入。重定向的标准符号 〉 创建一个新的文件。〉〉 符号将输出添加到一个现有的文件中:

  $ more test2.out
  Another test.
  $ cat test.out 〉〉 test2.out
  $ cat test2.out

  Another test.
  This is a test.

  到文件的标准输入可以用 〈 符号来重定向:

  $ cat 〈 test2.out

  错误消息用 2〉 和 2〉〉 来重定向和添加,格式如下:

  $ command 2〉 name_of_error_file

  要避免无意地覆盖一个现有的文件,使用 BASH 内置的命令集:

  $ set -o noclobber

  可以在命令和输出文件之间用 〉! 符号来重载这个特性。要关闭这个特性,用 +o 代替 -o。

  重定向在一个命令和文件之间、或文件和文件之间工作。重定向语句的一项必须是一个文件。

  管道使用 |符号,并且在命令之间工作。例如,您可以用以下方式将一个命令的输出直接发送到打印机上:

  $ ls -l * | lpr

  可以用以下方式快速地找到历史列表中的一个命令:

  $ history | grep cat

  更多的滤波器

  Grep、fgrep 和 egrep 都显示匹配一种模式的行。所有这三个命令都在文件中搜索指定的模式,如果您想不起来一个所需文件的名称,这将非常有用。基本格式是:

  grep [options] PATTERN [FILE...]

  $ grep -r 'Subject' nsmail

  CTRL-Z 将终止上述或其它任何命令。

  grep 的最有用的选项可能是 -s。如果您以除根用户之外的任何身份搜索系统文件,那么对于每一个您没有访问权限的文件,都将产生错误消息。这个命令禁止那些消息。

  Fgrep(也以 grep -F 调用)只查找固定的字符串,而不是 grep 接收的正则表达式。而 egrep 接收包含更大范围的特殊字符(如 “|”,它指示条件 OR 运算符)的模式。

  $ egrep 'Subject|mailto' *

  查找文件

  find 命令的 GNU 版本非常强大、灵活并且比 UNIX 系统上存在的经典版本更具包容性。它对于涉及到目录结构的任务非常有用,包括在文件上查找和执行命令。find 命令的基本格式是:

  $ find startdirectory options matchcriteria [actionoptions]

  如果您知道文件的名称、或者甚至名称的一部分,但不知道它所处的目录,您可以这么做:

  $ find .-name 'test*'
  ./test
  ./jdevhome/mywork/EmpWS/EmpBC4J/test

  与经典的 UNIX 系统不同,在 Linux 中不需要在末尾添加 -print 操作,因为如果没有指定其它的操作选项,就将假定执行这个操作。在目录起始位置上的一个点 ( . ) 将使 find 在您的工作目录中开始搜索。两个点, ..,在父目录中开始搜索。您可以在任意目录下开始搜索。

  注意,您可以使用通配符作为搜索准则的一部分(只要用单引号将整个项目括起来)。

  $ find .-name 'test*' -print
  ./test.out
  ./test2.out

  显示拥有 .out 扩展名的一系列文件:

  $ find /home -name '*.out'

  不过记住,除非您是作为超级用户运行这个命令,否则您将可能得到许多的 'Permission denied' 错误消息。

  最强大的搜索工具之一是和 grep 一起使用的 -exec 操作:

  $ find .-name '*.html' -exec grep 'mailto:foo@yahoo.com' {} ;

  这里,我们让 find 命令在当前目录中开始执行, .,查找一个 html 文件,*.html,并在当前文件上执行 (-exec) grep 命令,{}。当使用 -exec 操作时,需要一个分号 ;,这是用来在使用 find 命令时执行其它一些操作。需要反斜线 和引号来确保这些项目通过 BASH,以使它们由命令而不是 shell 来进行解释。

  立即掌握 Linux 文件命令

  在 Linux 中提供了许多有用的命令和利用它们的强大的方法,在此无法一一说明。此外,完成许多任务通常都存在多种方法。

  我们已经看到了一些最常用和最有启发意义的 Linux 文件命令。掌握这些基础但却关键的工具将使您的 Linux 学习走上快车道。利用您手头上的 man 页面,和试验的积极性,您现在拥有了足够的信息来开始探索 Linux 文件操作的力量。

  在我的下一篇文章中,我将提供 Linux 系统命令的一个类似的说明。

  关于作者:

  Sheryl Calish [scalish@earthlink.net] 是 Blue Heron Consulting 的一位专门研究 Linux 的 Oracle 开发人员。她还是 Central Florida Oracle Users Group 的基金主席和 IOUG Linux SIG 的销售主席。

(0)

相关推荐

  • Linux系统文件命令精通指南(下)

    在"Linux 文件命令精通指南(上)"中,我们讨论了利用最基础和最常用 Linux 文件命令所需的基本信息.在本文中,我将对 Linux 系统命令作同样的讨论. 我们在前一篇文章中了解到,在 Linux/UNIX 世界中,一切都被看作文件,包括系统管理命令.单独对于组织而言,我们在本系列的第一部分中讨论了文件命令,并将在本文中提供最有用的系统诊断和维护命令. 对于文件命令,我们在此处详尽讨论了某些相当简单和直观的管理命令.而只描述了其他较复杂命令的功能,以便在您需要使用时,知道存在这

  • Linux:文件命令精通指南

    虽然 GUI 桌面(如 KDE 和 GNOME)能够帮助用户利用 Linux 特性,而无需关于命令行接口的功能知识,但还是经常会需要更多的功能和灵活性.而且,基本熟悉这些命令对于在 shell 脚本中正确地使某些功能自动化仍然是必需的. 这篇文章是关于 Linux 文件命令的一个"速成教程",它是为那些刚接触这个操作系统或者只是需要补充这方面知识的用户提供的.它包含了对一些更有用的命令的一个简明的概述以及关于它们的最强大的应用的指导.下面包含的信息 - 结合一些实验 - 将使您能够容易

  • Linux系统文件命令精通指南(上)

    虽然 GUI 桌面(如 KDE 和 GNOME)能够帮助用户利用 Linux 特性,而无需关于命令行接口的功能知识,但还是经常会需要更多的功能和灵活性.而且,基本熟悉这些命令对于在 shell 脚本中正确地使某些功能自动化仍然是必需的. 这篇文章是关于 Linux 文件命令的一个"速成教程",它是为那些刚接触这个操作系统或者只是需要补充这方面知识的用户提供的.它包含了对一些更有用的命令的一个简明的概述以及关于它们的最强大的应用的指导.下面包含的信息 - 结合一些实验 - 将使您能够容易

  • Linux系统文件命令精通指南

    对于文件命令,我们在此处详尽讨论了某些相当简单和直观的管理命令.而只描述了其他较复杂命令的功能,以便在您需要使用时,知道存在这些命令及其用途.本文不涉及对每个命令使用背后的基本原理的详细讨论,但是我们将讨论最基本和最有用的命令,这些命令用于监视和管理打印机服务.文件系统.磁盘和进程. 有关超级用户的更多信息 这里讨论的很多命令可以由常规用户在其自己的文件和进程中执行.但是,某些命令,如 fdisk,需要有 root 权限才能运行. 为了您的系统的完整性,建议您避免直接以 "root"

  • Linux 系统命令精通指南

    在"Linux 文件命令精通指南"中,我们讨论了利用最基础和最常用 Linux 文件命令所需的基本信息.在本文中,我将对 Linux 系统命令作同样的讨论. 我们在前一篇文章中了解到,在 Linux/UNIX 世界中,一切都被看作文件,包括系统管理命令.单独对于组织而言,我们在本系列的第一部分中讨论了文件命令,并将在本文中提供最有用的系统诊断和维护命令. 对于文件命令,我们在此处详尽讨论了某些相当简单和直观的管理命令.而只描述了其他较复杂命令的功能,以便在您需要使用时,知道存在这些命令

  • Linux 按时间批量删除文件命令(删除N天前文件)

    需要根据时间删除这个目录下的文件,/home/lifeccp/dicom/studies,清理掉20天之前的无效数据. 可以使用下面一条命令去完成: find /home/lifeccp/dicom/studies -mtime +21 -name "*.*" -exec rm -Rf {} \; 这个是根据时间删除. 下面简要解释一下,这句shell命令: find /home/lifeccp/dicom/studies -mtime +21 -name "*.*"

  • Linux中的搜索文件命令

    文件搜索命令locate:搜索快,新建文件无法搜索: 命令格式: locate 文件名  //在后台数据库中按文件名搜索,搜索速度快: /var/lib/mlocate : locate命令所搜索的后台数据库 命令:updatedb // 更新数据库,默认是一天自动更新: /etc/uodatedb.conf 配置文件中: 1.      PRUNE_BIND_MOUNTS = "yes" 开启搜索限制 2.      PRINEFS = 搜索时,不搜索的文件系统: 3.      P

  • Linux du命令查看文件夹大小并按降序排列

    1. df -lh 2. du -s /usr/* | sort -rn 这是按字节排序 3. du -sh /usr/* | sort -rn 这是按兆(M)来排序 4.选出排在前面的10个 du -s /usr/* | sort -rn | head 5.选出排在后面的10个 du -s /usr/* | sort -rn | tail du -h –-max-depth=0 user du -sh –-max-depth=2 | more 总结du常用命令 du -h --max-dept

  • PHP调用Linux的命令行执行文件压缩命令

    前几天工作中,需要将3个txt文件,打包成*.zip down到本地-- 一开始,我和普通青年一样,想到用PHP内置的 ZipArchive,代码看起来应该是这样的: 复制代码 代码如下: /*拆分成3个txt文件 分别是wow_1.txt wow_2.txt 和 wow_3.txt*/ $zip=new ZipArchive(); $zipfile='./Exl_file/wow.zip'; if($zip->open($zipfile,ZIPARCHIVE::CREATE)===TRUE){

  • 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服务器上当前目录下要下载的文件名  [下载到本地机器上当前

随机推荐