文件处理

来源:互联网 发布:绝地求生透视辅助源码 编辑:程序博客网 时间:2024/05/01 10:55

1. 使用touch更新修改时间

使用touch命令更新修改时间,如下:

[root@local~]#touch    some-file

使用touch建立空文件:它们的存在与时间戮是有意义的,但它们的内容则否。最常见的例子是用于锁定文件,以指出程序已在执行中,不应启动第二个实例(instance)

使用touch记录文件的时间戳,供日后与其他文件对照用。

1.1. touch命令

1.2.1. 语法与参数

语法

touch [OPTION]... FILE...

touch [-acm] MMDDhhmm[YY]FILE... (obsolescent)

用途

该命令可以同时或单独变更档案的两种时间纪录,读取时间(access time)以及修改时间(modification time)

主要选项

-a 更改文件的读取时间(access time)

-c, --no-create 不建立任何新档案不建立任何新档案

-m 更改文件的修改时间(modification time)

-t STAMP 设定"特定时间"来代替"目前时间",格式 [[CC]YY]MMDDhhmm[.ss]

-r 复制参照文件的时间戳

1.2.2 例子

1. 建立空档案

[root@local~]# touch file-touch1

[root@local~]# ls -l

total 0

-rw-r--r-- 1 root root 0 7 9 13:53 file-touch1

2. 如果不想建立空档案,就是用-c选项

[root@local~]#touch -c file-touch2

touch: setting times of `file-touch2': 没有此一档案或目录 

3.复制参照文件的时间戳

[root@local~]#touch-r US-bicentennial birthday

[root@local~]#1s -1birthday

-rw-rrr-r--  1 Jones devel 0 Jul  4  1976birthday

4.打算将档案时间变更为 2002 年 7 1 8 00 01

[root@local~]#touch-t 200207010800.01 tcsh

[root@local~]#ls--full-time

total 288

-rwxr-xr-x 1 rootroot 288604 周一 7 01 08:00:01 2002 tcsh

5.单独变更"读取时间"

[root@local~]#touch-at 200207022300 tcsh

[root@local~]#ls -lu

total 288

-rwxr-xr-x 1 rootroot 288604 7 2 23:00tcsh

6.单独变更"修改时间"

[root@local~]#touch-mt 200206302300 tcsh

[root@local~]#ls -l

total 288

-rwxr-xr-x 1 rootroot 288604 6 30 23:00tcsh

2. $$变量

共享的目录或同一程序的多个执行实例,都可能造成文件名冲突。在Shell脚本里的传统做法是使用进程ID,可以在Shell变量事$$中取得,构建成临时性文件的一部分。要解决完整临时性文件名发生此问题的可能性,可使用环境变量覆盖目录称,通常是TMPDIR。另外,你应该使用trap命令,要求在工作完成时删除临时性件。因此,常见的5he11脚本起始如下:

umask 077                               #删除用户以外其他人的所有访问权

TMPFILE=${TMPDIR-/tmp}/myprog.$$    #产生临时性文件名

trap ' rm-f $TMPFILE' EXTT              #完成时删除临时性文件

3. 比较文件

3.1. cmp命令

3.1.1. 语法与参数

语法

    cmp[-clsv][-i <字符数目>] [第一个文件][第二个文件]

用途

    比较两个文件是否有差异。

主要选项

-c 除了标明差异处的十进制字码外,一并显示该字符所对应字符。

-i<字符数目> 指定一个数目。

-l--verbose  标示出所有不一样的地方。

-s--quiet--silent  不显示错误信息。

补充说明:

当相互比较的两个文件完全一样时,则该指令不会显示任何信息。若发现有所差异,预设会标示出第一个不同之处的字符和列数编号。若不指定任何文件名称或是所给予的文件名为"-",则cmp指令会从标准输入设备读取数据。

3.1.2. 例子

比较两个不同的文件

[root@local~]# cmp /bin/cp /bin/ls

/bin/cp /bin/ls differ: char 27, line1   #输出结果指出第一个不同处的位置

3.2. diff命令

3.2.1. 语法与参数

语法

    diff[选项] 源文件 目标文件

用途

    找出两个文件的不同点。

主要选项

-a 所有的文件都视为文本文件来逐行比较,甚至他们似乎不是文本文件。

-b| -w 忽略空格引起的变化。

-B 忽略插入删除空行引起的变化。

-d 改变算法也许发现变化的一个更小的集合。这会使 diff 变慢 (有时更慢)

--expand-tabs 在输出时扩展tab为空格,保护输入文件的tab对齐方式。

-i| --ignore-case 忽略大小写。

-N --new-file 在目录比较中,如果那个文件只在其中的一个目录中找到,那么它被视为在另一个目录中是一个空文件。

-P 在目录比较中,如果那个文件只在其中的一个目录中找到,那么它被视为在另一个目录中是一个空文件。

--paginate 产生通过 pr 编码的输出。

-q 仅报告文件是否相异,不报告详细的差异。

-r | --recursive 当比较目录时,递归比较任何找到的子目录。

-t 在输出时扩展tab为空格,保护输入文件的tab对齐方式

-u 使用统一的输出格式。

3.2.2. 例子

[root@local~]# echo test 1 > test.l

[root@local~]# echo test 2 > test.l

[root@local~]# diff test.1 test.2

1c1

<test 1

---

>test 2

注意:使用diff的惯例是:将旧文件作为第一个参数。不同的行会以前置左角括号的方式,对应到左边的(第一个)文件,而前置右角括号则指的是右边的(第二个)文件。最前面的lcl为输入文件行编号的简洁表示方式,指出不同之处以及需要编辑的操作:在这里,C表示改变(change)。在大一点的例子下,你还可能发现a是增加(add),与d是删除(delete)之意。

3.3. pacth命令

patch工具程序可利用diff的输出,结合原始文件,以重建另一个文件。

3.3.1. 语法与参数

语法

patch [options][option <value][-p <剥离层级>] < [修补文件]

用途

    patch指令让用户利用设置修补文件的方式,修改,更新原始文件。

主要选项

-p|--strip=<剥离层级>  设置欲剥离几层路径名称。

3.3.2. 例子

1.更新文件

[root@local~]# diff -c test.1 test.2.> test.dif   #将相异处的相关内文,存储到test.dif

[root@local~]#patch< test.dif             #应用不同之处

patching file test.1

[root@local~]#cat test.l                   #显示修补后(patched)test.1

test 2

2.更新目录

[root@local~]#mkdir /tmp/old; cp /etc/passwd /tmp/old  

[root@local~]#mkdir /tmp/new; cp /tmp/test/passwd /tmp/new

[root@local~]#cd /tmp; diff –Naur old/ new/ > test.patch

[root@local~]#cd /tmp/old

[root@local~]#patch –p1 < /tmp/ test.patch

patching file passwd

注意:使用head –n 1//tmp/ test.patch查看第一行内容如下:

diff –Naur old/passwd new/passwd

而我们升级所在的目录是old,所以必须减去一层目录。