您的位置:首页 > 运维架构 > Shell

ubuntu之shell编程学习笔记6——文件和文件系统

2012-02-14 15:52 323 查看
Linux:find 按文件修改时间查找文件

find /home/admin -mtime -1 #查找/home/admin目录下修改时间在1天之内的文件

find /home/admin -name *.txt -mtime -1 #查找/home/admin目录下修改时间在1天之内的文件名为.txt结尾的文件

find 按文件修改时间查找文件

---(+n)----------|----------(n)----------|----------(-n)---

(n+1)*24H前| (n+1)*24H~n*24H间 |n*24H内

-ctime -n 查找距现在 n*24H 内修改过的文件

-ctime n 查找距现在 n*24H 前, (n+1)*24H 内修改过的文件

-ctime +n 查找距现在 (n+1)*24H 前修改过的文件

[a|c|m]min [最后访问|最后状态修改|最后内容修改]min

[a|c|m]time [最后访问|最后状态修改|最后内容修改]time

linux 文件的三种时间(以 find 为例):

atime 最后一次访问时间, 如 ls, more 等, 但 chmod, chown, ls, stat 等不会修改些时间, 使用 ls -utl 可以按此时间顺序查看;

ctime 最后一次状态修改时间, 如 chmod, chown 等状态时间改变但修改时间不会改变, 使用 stat file 可以查看;

mtime 最后一次内容修改时间, 如 vi 保存后等, 修改时间发生改变的话, atime 和 ctime 也相应跟着发生改变.

注意: linux 里是不会记录文件的创建时间的, 除非这个文件自创建以来没有发生改变, 那么它的创建时间就是它的最后一次修改时间.

#ls -lt /home/admin # 按修改时间顺序查看

#ls -lut /home/admin # 按访问时间顺序查看

(如果想反序查看的话需要加一个选项 -r)

在Linux中,没有文件创建时间的概念。只有文件的访问时间、修改时间、状态改变时间。也就是说不能知道文件的创建时间。

但如果文件创建后就没有修改过,修改时间=创建时间;如果文件创建后,状态就没有改变过,那么状态改变时间=创建时间;如果文件创建后,没有被读取过,那么访问时间=创建时间,这个基本不太可能。

stat命令 文件创建时间查看。

# stat nohup.out

File: `nohup.out'

Size: 8306 Blocks: 32 IO Block: 4096 regular file

Device: 802h/2050d Inode: 820136 Links: 1

Access: (0777/-rwxrwxrwx) Uid: ( 0/ root) Gid: ( 0/ root)

Access: 2007-05-28 10:28:59.492016424 -0400

Modify: 2006-11-16 09:04:03.000000000 -0500

Change: 2007-05-28 10:27:44.074481632 -0400

说明:Access访问时间。Modify修改时间。Change状态改变时间。

可以stat *查看这个目录所有文件的状态

文件的比较

Comm命令

如果想对两个有序的文件进行比较,可以使用comm命令。

语法:comm [- 123 ] file1 file2

说明:该命令是对两个已经排好序的文件进行比较。其中file1和file2是已排序的文件。comm读取这两个文件,然后生成三列输出:仅在file1中出现的行;仅在file2中出现的行;在两个文件中都存在的行。如果文件名用“- ”,则表示从标准输入读取。

选项1、2或3抑制相应的列显示。例如

comm - 12就只显示在两个文件中都存在的行;

comm - 23只显示在第一个文件中出现而未在第二个文件中出现的行;

comm - 123则什么也不显示。

例如:假设要对文件myfile1和myfile2进行比较

$ cat myfile1

main( )

{

float a,b, i, j ,z ;

a=i=10 ; b=j=5 ;

z= i + j ;

printf(“z=%d\\\\n”,z) ;

}

$ cat myfile2

#include

main( )

{

float i, j ,z ;

i=10 ; j=5 ;

z= i + j ;

printf(“z=%f\\\\n”,z) ;

}

$ comm - 12 myfile1 myfile2

main( )

{

z= i + j ;

}

就只显示文件myfile1和myfile2中共有的行。

----------------------------------------------------

Diff命令

该命令的功能为逐行比较两个文本文件,列出其不同之处。它比comm命令完成更复杂的检查。它对给出的文件进行系统的检查,并显示出两个文件中所有不同的行,不要求事先对文件进行排序

语法:diff [选项] file1 file2

说明:该命令告诉用户,为了使两个文件file1和file2一致,需要修改它们的哪些行。如果用“- ”表示file1或fiie2,则表示标准输入。如果file1或file2是目录,那么diff将使用该目录中的同名文件进行比较。例如:

diff /usr/xu mine

把目录/usr/xu 中名为mine的文件与当前目录中的mine文件进行比较

通常输出由下述形式的行组成:

n1 a n3,n4

n1,n2 d n3

n1,n2 c n3,n4

这些行类似ed命令把filel转换成file2。字母(a、d和c)之前的行号(n1,n2)是针对file1的,其后面的行号(n3,n4)是针对file2的。字母a、d和c分别表示附加、删除和修改操作。

在上述形式的每一行的后面跟随受到影响的若干行,以“<”打头的行属于第一个文件,以“>”打头的行属于第二个文件。

diff能区别块和字符设备文件以及FIFO(管道文件),不会把它们与普通文件进行比较。

如果file1和file2都是目录,则diff会产生很多信息。如果一个目录中只有一个文件,则产生一条信息,指出该目录路径名和其中的文件名。

参  数:

 -<行数>  指定要显示多少行的文本。此参数必须与-c或-u参数一并使用。

 -a或--text  diff预设只会逐行比较文本文件。

 -b或--ignore-space-change  不检查空格字符的不同。

 -B或--ignore-blank-lines  不检查空白行。

 -c  显示全部内文,并标出不同之处。

 -C<行数>或--context<行数>  与执行"-c-<行数>"指令相同。

 -d或--minimal  使用不同的演算法,以较小的单位来做比较。

 -D<巨集名称>或ifdef<巨集名称>  此参数的输出格式可用于前置处理器巨集。

 -e或--ed  此参数的输出格式可用于ed的script文件。

 -f或-forward-ed  输出的格式类似ed的script文件,但按照原来文件的顺序来显示不同处。

 -H或--speed-large-files  比较大文件时,可加快速度。

 -l<字符或字符串>或--ignore-matching-lines<字符或字符串>  若两个文件在某几行有所不同,而这几行同时都包含了选项中指定的字符或字符串,则不显示这两个文件的差异。

 -i或--ignore-case  不检查大小写的不同。

 -l或--paginate  将结果交由pr程序来分页。

 -n或--rcs  将比较结果以RCS的格式来显示。

 -N或--new-file  在比较目录时,若文件A仅出现在某个目录中,预设会显示:

Only in目录:文件A若使用-N参数,则diff会将文件A与一个空白的文件比较。

 -p  若比较的文件为C语言的程序码文件时,显示差异所在的函数名称。

 -P或--unidirectional-new-file  与-N类似,但只有当第二个目录包含了一个第一个目录所没有的文件时,才会将这个文件与空白的文件做比较。

 -q或--brief  仅显示有无差异,不显示详细的信息。

 -r或--recursive  比较子目录中的文件。

 -s或--report-identical-files  若没有发现任何差异,仍然显示信息。

 -S<文件>或--starting-file<文件>  在比较目录时,从指定的文件开始比较。

 -t或--expand-tabs  在输出时,将tab字符展开。

 -T或--initial-tab  在每行前面加上tab字符以便对齐。

 -u,-U<列数>或--unified=<列数>  以合并的方式来显示文件内容的不同。

 -v或--version  显示版本信息。

 -w或--ignore-all-space  忽略全部的空格字符。

 -W<宽度>或--width<宽度>  在使用-y参数时,指定栏宽。

 -x<文件名或目录>或--exclude<文件名或目录>  不比较选项中所指定的文件或目录。

 -X<文件>或--exclude-from<文件>  您可以将文件或目录类型存成文本文件,然后在=<文件>中指定此文本文件。

 -y或--side-by-side  以并列的方式显示文件的异同之处。

 --help  显示帮助。

 --left-column  在使用-y参数时,若两个文件某一行内容相同,则仅在左侧的栏位显示该行内容。

 --suppress-common-lines  在使用-y参数时,仅显示不同之处。

例如,文件ml.c的内容为(左边行号是有意加上的,以便前后对照):

1 main( )

{

printf(“Hello!\n”);

}

5

文件m2.c的内容为:

1 main()

2 {

3 int n , m ;

4 n= 10 ;

5 printf ( “ % d \\\\ n ” , m = n * 10);

6 }

输入命令:

$ diff m1.c m2.c

屏幕上显示:

3,5 c 3,6

printf(“Hello!\n”);

}

<5

>3 int n,m;

>4 n=10 ;

>5 printf ( “ % d \\\\ n ” , m = n * 10);

>6 }

 表示把文件m1.c的3至5行改成m2.c的3至6行后,两个文件相同。

diff最常用的功能

  diff有很多功能平时我们不常用到,最常用的功能莫过于生成patch文件了:

  diff -urN old/ new/ 》 mysoft.patch

  参数 -u 表示使用 unified 格式,-r 表示比较目录,-N 表示将不存在的文件当作空文件处理,这样新添加的文件也会出现在patch文件中。

  然后在需要应用patch的地方使用下述命令即可:

  patch -p0 《 mysoft.patch

  diff的 -y 命令(长格式为 –side-by-side)可以将屏幕分成左右两部分,来比较两个文件之间的差异。许多图形化的比较工具都有这个功能,但如果只能使用命令行,这个参数就相当有用了。如果要改变左右各部分的宽度,可以通过 -W (–width)参数来指定。

  –ignore-blank-lines 参数可以不检查空白行。这样DOS格式和Unix格式的文件互相比较时,就不至于因为换行符不一致而出现大量的差异。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: