分类: LINUX
2009-06-24 23:17:54
在 Sheryl 的文章中,您学习了如何使用 chown 和 chgrp 命令来更改文件的所有权和组。假设有如下几个文件:
# ls -l
total 8
-rw-r--r-- 1 ananda users 70 Aug 4 04:02 file1
-rwxr-xr-x 1 oracle dba 132 Aug 4 04:02 file2
-rwxr-xr-x 1 oracle dba 132 Aug 4 04:02 file3
-rwxr-xr-x 1 oracle dba 132 Aug 4 04:02 file4
-rwxr-xr-x 1 oracle dba 132 Aug 4 04:02 file5
-rwxr-xr-x 1 oracle dba 132 Aug 4 04:02 file6
并且您需要更改所有文件的权限以便与 file1 的权限匹配。当然,您可以执行 chmod 644 * 来进行此更改,但如果您要编写一个脚本来执行该操作,而事先却并不知道这些权限,那该怎么办?或者,您可能要基于许多不同的文件进行多个权限更改,但却发现逐个使用这些文件的权限并进行相应的修改并不可行。
一种更好的方法是使权限类似于另一个文件的权限。以下命令使 file2 的权限与 file1 相同:
chmod --reference file1 file2
现在,如果您查看以下示例:
# ls -l file[12]
total 8
-rw-r--r-- 1 ananda users 70 Aug 4 04:02 file1
-rw-r--r-- 1 oracle dba 132 Aug 4 04:02 file2
file2 的权限完全按照 file1 中的权限进行了更改。您不必先获取 file1 的权限。
您还可以将同一技巧用于文件中的组成员关系。要使 file2 的组与 file1 相同,可以执行以下命令:
# chgrp --reference file1 file2
# ls -l file[12]
-rw-r--r-- 1 ananda users 70 Aug 4 04:02 file1
-rw-r--r-- 1 oracle users 132 Aug 4 04:02 file2
当然,适用于更改组的方法也同样适用于所有者。下面演示了如何将同一技巧用于所有权更改。如果权限如下所示:
# ls -l file[12]
-rw-r--r-- 1 ananda users 70 Aug 4 04:02 file1
-rw-r--r-- 1 oracle dba 132 Aug 4 04:02 file2
则可以按以下方式更改所有权:
# chown --reference file1 file2
# ls -l file[12]
-rw-r--r-- 1 ananda users 70 Aug 4 04:02 file1
-rw-r--r-- 1 ananda users 132 Aug 4 04:02 file2
注意,组和所有者已经更改。
查看文件时,如何知道它的文件类型?命令 file 可以显示文件类型。例如:
# file alert_DBA102.log
alert_DBA102.log:ASCII text
文件 alert_DBA102.log 是一个 ASCII 文本文件。来看看更多示例:
# file initTESTAUX.ora.Z
initTESTAUX.ora.Z:compress'd data 16 bits
该示例指示文件是压缩文件,但如何知道文件的压缩类型?方法之一是将该文件解压缩并再次运行它;但这实际上是几乎不可能的。一种更简便的方法是使用参数 -z:
# file -z initTESTAUX.ora.Z
initTESTAUX.ora.Z:ASCII text (compress'd data 16 bits)
另一种方法是显示符号链接:
# file spfile+ASM.ora.ORIGINAL
spfile+ASM.ora.ORIGINAL:symbolic link to
/u02/app/oracle/admin/DBA102/pfile/spfile+ASM.ora.ORIGINAL
尽管该方法很有用,但所指向的文件的类型是什么?可以使用选项 -l,而不必再次运行文件:
# file -L spfile+ASM.ora.ORIGINAL
spfile+ASM.ora.ORIGINAL:data
该示例清楚地表明该文件是数据文件。注意,与 init.ora 不同的是,spfile 文件是一个二进制文件;因此文件显示为数据文件。
假设您要在用户转储目标目录中搜索某个跟踪文件,但不知道该文件是否位于其他目录并只以一个符号链接形式存在,或某个人是否压缩了该文件(甚至对其进行了重命名)。有一点您是知道的:该文件肯定是一个 ascii 文件。下面演示了如何执行操作:
file -Lz * | grep ASCII | cut -d":"-f1 | xargs ls -ltr
该命令将检查 ASCII 文件(即使它们经过了压缩)并按时间顺序将其列出。
如何判断两个文件(file1 和 file2)是否相同?方法有多种,每种方法都有其自身的优点。
diff。最简单的命令是 diff,用于显示两个文件之间的差别。以下是这两个文件的内容:
# cat file1
In file1 only
In file1 and file2
# cat file2
In file1 and file2
In file2 only
使用 diff 命令能够了解这两个文件之间的差别,如下所示:
# diff file1 file2
1d0
< In file1 only
2a2
> In file2 only
#
在以上输出中,第一列中的“<”表示该行位于上面最先提到的文件(即 file1)中。第一列中的“>”表示该行位于第二个文件 (file2) 中。输出第一行中的字符 1d0 显示为了作用于文件 file1(以使其与 file2 相同)而在 sed 中必须执行的操作。
另一个选项 -y 显示了相同的输出,只不过输出是并排显示的:
# diff -y file1 file2 -W 120
In file1 only <
In file1 and file2 In file1 and file2
> In file2 only
-W 选项是可选的;它仅指示该命令使用宽度为 120 个字符的屏幕输出,这对于包含长行的文件很有用。
如果只希望了解文件是否不同,而不必知道如何不同,则可以使用 -q 选项。
# diff -q file3 file4
# diff -q file3 file2
Files file3 and file2 differ
由于文件 file3 和 file4 相同,因此没有输出;在另一个示例中,将报告文件存在差别。
如果要编写 shell 脚本,则采用以下方式生成可以分析的输出可能比较有用。-u 选项可以执行该操作:
# diff -u file1 file2
--- file1 2006-08-04 08:29:37.000000000 -0400
+++ file2 2006-08-04 08:29:42.000000000 -0400
@@ -1,2 +1,2 @@
-In file1 only
In file1 and file2
+In file2 only
以上输出显示了这两个文件的内容,但并未显示重复内容,第一列中的 + 号和 - 号指示文件中的行。第一列中的任何字符均未指示这两个文件中同时存在的内容。
该命令可以识别空格。如果要忽略空格,请使用 -b 选项。使用 -B 选项忽略空白行。最后,使用 -i 忽略大小写。
diff 命令还可以应用于目录。命令
diff dir1 dir2
显示文件文件存在于任一目录中;无论文件是存在于这两个目录中的一个,还是同时存在于这两个目录中。如果它找到同名的子目录,则不会继续查看任何单个文件是否存在差别。示例如下:
# diff DBA102 PROPRD
Common subdirectories:DBA102/adump and PROPRD/adump
Only in DBA102:afiedt.buf
Only in PROPRD:archive
Only in PROPRD:BACKUP
Only in PROPRD:BACKUP1
Only in PROPRD:BACKUP2
Only in PROPRD:BACKUP3
Only in PROPRD:BACKUP4
Only in PROPRD:BACKUP5
Only in PROPRD:BACKUP6
Only in PROPRD:BACKUP7
Only in PROPRD:BACKUP8
Only in PROPRD:BACKUP9
Common subdirectories:DBA102/bdump and PROPRD/bdump
Common subdirectories:DBA102/cdump and PROPRD/cdump
Only in PROPRD:CreateDBCatalog.log
Only in PROPRD:CreateDBCatalog.sql
Only in PROPRD:CreateDBFiles.log
Only in PROPRD:CreateDBFiles.sql
Only in PROPRD:CreateDB.log
Only in PROPRD:CreateDB.sql
Only in DBA102:dpdump
Only in PROPRD:emRepository.sql
Only in PROPRD:init.ora
Only in PROPRD:JServer.sql
Only in PROPRD:日志
Only in DBA102:oradata
Only in DBA102:pfile
Only in PROPRD:postDBCreation.sql
Only in PROPRD:RMANTEST.sh
Only in PROPRD:RMANTEST.sql
Common subdirectories:DBA102/scripts and PROPRD/scripts
Only in PROPRD:sqlPlusHelp.log
Common subdirectories:DBA102/udump and PROPRD/udump
注意,普通的子目录只按这种方式报告,而不进行比较。如果要进一步深究,并比较这些子目录中的文件,则应使用以下命令:
diff -r dir1 dir2
该命令将采用递归方式进入每个子目录,以比较文件并报告同名文件之间的差别。
cmp.命令 cmp 类似于 diff:
# cmp file1 file2
file1 file2 differ:byte 10, line 1
只要遇到差别就会返回输出。可以使用此输出标识文件在何处可能存在差别。与 diff 一样,cmp 有很多选项,其中最重要的选项是 -s 选项,它只返回一个代码:
示例如下:
# cmp -s file3 file4
# echo $?
0
特殊变量 $? 指示返回代码来自上次执行的命令。在本示例中,该变量为 0,表示文件 file1 和 file2 相同。
# cmp -s file1 file2
# echo $?
1
表示 file1 和 file2 不同。
cmp 的这个属性对于 shell 脚本非常有用,因为在 shell 脚本中您只希望检查两个文件是否存在差别,而不必检查差别是什么。该命令的另一个重要用途是比较二进制文件,而 diff 对于比较二进制文件可能并不可靠。
comm.命令 comm 与其他命令相似,只是输出分三列显示,并且列之间由制表符分隔。示例如下:
# comm file1 file2
In file1 and file2
In file1 only
In file1 and file2
In file2 only
本部分中的命令摘要
|
如果您想要查看某个文件的内容(另一个文件中不存在这些内容),而不仅仅是差别(SQL 语言中 MINUS 实用程序的排序),则该命令将很有用。-1 选项将不显示在第一个文件中找到的内容:
# comm -1 file1 file2
In file1 and file2
In file2 only
md5sum.该命令将生成文件的 32 位 MD5 散列值:
# md5sum file1
ef929460b3731851259137194fe5ac47 file1
可以将两个具有相同校验和的文件视为相同。而该命令的用途并不仅仅限于比较文件。它还可以提供一种机制来确保文件的完整性。
假设您有两个需要保护的重要文件,file1 和 file2。可以使用 --check 选项检查并确保文件未更改。首先,为这些重要文件创建校验和文件,然后对其进行安全保存:
# md5sum file1 file2 > f1f2
以后,当您要验证这些文件是否仍保持不变时,可执行如下操作:
# md5sum --check f1f2
file1:OK
file2:OK
这清楚地表明文件未被修改。现在,更改一个文件并检查 MD5:
# cp file2 file1
# md5sum --check f1f2
file1:FAILED
file2:OK
md5sum:WARNING:1 of 2 computed checksums did NOT match
输出清楚地表明 file1 已被修改。
原文地址