【学习笔记】shell文件处理

1、设定变量DestDir

DestDir=~/tmp   ~不可以放在单引号或双引号中,否则会失去家目录的替换效果。

2.DirCnt=$(ls $DestDir/*.txt)

如果文件数量不多是,变量DirCnt占用内存的情况不严重。

如果目录中的文件非常多时,不但执行速度慢,耗用大量的内存,而且为了展开

*.txt的通配符,可能会出现”bash:/bin/ls:argument list too long"参数行过长的错误信息,

而无法正常运行。此时可该用find /xargs,搭配进程替换来解决。

查看参数行长度的上限值,可以执行getconfi ARG_MAX 或查看linu/limits.h(linux),sys/syslimits.h(BSD)

中ARG_MAX的定义值。

解法1:使用find把扩展名是.txt的文件找出来,通过进程替换把每一个文件丢给

while循环去处理。

listtoolong.sh

#! /bin/bash

 

shopt -s -o nounset

DestDir=~/tmp

while read f

do

 echo $f

done < <(find $DestDir -name '*.txt')

解法2:使用find 和xargs

listtoolong.sh

shopt -s -o nounset

DestDir=~/tmp

while read f

do

 echo $f

done < <(find $DestDir -name '*.txt' |xargs -n2)

使用xargs的优点是可以调整一次要取用的文件个数。缺点是要调用外部程序xargs,执行速度会比较慢。

解法3:不使用命令替换,直接在for循环中,处理每一个文件

listtoolong3.sh

shopt -s -o nounset

DestDir=~/tmp

 

for f in $DestDir/*.txt

do

 echo $f

done

*.txt并不会展开成某一个命令的参数行,因此没有参数过长的问题。

 

3.判断文件是否存在:

对文件进行复制、修改、删除、执行等操作之前,要先判断文件是否存在.

判断文件是否存在 -f; 判断目录是否存在 -d.

常用判断文件存在方法:[判断式] && 指令

使用-b判断文件是否为块设备文件:

[ -b /dev/sda ] && echo "块设备文件存在“

使用-c判断文件是否为字符设备文件

[ -c /dev/tty1 ] && echo ’字符设备文件存在‘

使用 -S判断文件是否为 Socket文件:

[ -S /var/run/mysqld/mysqld.sock ] && echo 'socket 文件存在”

socket文件是指内部进程通信的一种机制,它通过文件系统当做寻址的名称空间,让不同

的进程可以通过这个文件相互沟通。

使用-p判断文件是否为FIFO文件:

[ -p $f ] && echo "$f是FIFO文件。“

所谓FIFO文件一种命名管道(named pipe),通过这个文件,某一个进程可将输出导向

给FIFO文件,另一个进程则由FIFO文件读取数据当做输入。在这个过程中,资料全由

核心在内部直接出来,不存放在文件系统中

使用-L判断文件是否为符号链接文件:

[ -L /etc/localtime ] && echo 

使用不管文件类型,只求判断文件是否存在,使用-e

[ -e /etc/hosts ] && echo '/etc/hosts exist'

判断文件是否可读、可写、可执行、文件大小是否不为0

使用-r判断读取文件:

[ -r ~/tmp/test.txt ] && echo 'can read'

使用-w判断写入权:

[ -w ~/tmp/test.txt ] && echo 'can write'

使用-x判断执行权:

[ -x ~/tmp/test.txt ] && echo 'can exec'

使用-s 判断文件大小是否不为0:

[ -s ~/tmp/test.txt ] && echo "not null"

4。建立文件及目录:

建立一般文件regular file:

方法1;使用转向输出 >test.txt

方法2:配合空命令 :>test.txt 增强移植性,有的shell,使用>文件来开启新文件。

方法3:建立隐藏文件: :>.test.txt

方法4:使用touch命令 touch原本用来修改文件时间,但如果文件不存在,会开启一个新文件。

方法5:echo 'hello bash.' >test.txt

方法6,ln test.txt test2.txt 新增一个文件的复本,链接计算加1

目录:mkdir

5、建立区块设备文件:

区块设备文件:是用来存储数据的媒体,或可供读取的接口设备。

前者如硬盘的分区/dev/hda1;后者如cdrom等外接设备/dev/cdrom

mknod myhda1 b 3 1

mknod命令可建立特殊的文件,如块设备文件,字符设备文件。FIFO文件。

mknod 选项 文件名 文件形态 主要设备代码MAJOR  次要设备代码MINOR

所谓MAJOR是指硬件的分类,而MINOR则是该硬件分类中再细分其特殊的属性。

6.建立字符设备文件:

字符设备文件是指可以读取序行字符的周边,如键盘,串行端口,鼠标,终端等

mknod -m 666 nullfile c 1 3 

/dev/null 文件很重要,如果不慎丢失。重建命令:

mknod -m 666 /dev/null c 1 3

7.建立FIFO文件

mknod myfifo p

在设计脚本的时候,可让两个不同的进程通过fifo文件,进行数据传递。

8.建立Socket文件

mksock mysocket mksock属于MAKEDEV套件的一部分。

/dev中一个重要的/dev/log文件,如果不慎丢失(误删)可以利用mksock重建

mksock /dev/log chmod 666 /dev/log

9.建立符号链接文件

符号链接是一种快捷方式的概念,是管理目录、备份系统、建立工作环境是重要的应用技巧。

ln 选项 来源文件 目标文件

ln -s test.txt tfile

ln -sf test.txt tfile

ln -s /root/tmp mytmp

 

10、取得文件属性

文件属性有13个:

设备编号

inode编号

文件模式

链接文件数量

文件拥有者编号

文件所属组编号

设备标识符

文件大小

取用文件的时间 atime

修改文件内容的时间mtime

修改文件模式的时间ctime。

区块大小

配置区块数码

如想取得文件的属性,最方便的方法是利用stat程序。stat可用来取得两种信息:

一个是文件系统,一个是文件 

用法:stat -f /dev/sda1 选项-f表示取用的时文件系统,而不是文件

stat支持许多取得文件属性的格式代码:基本用法:

stat -c 格式代码 文件 

如取得文件的大小:stat -c %s test.sh

FileSize=$(stat -c %s test.sh)

文件的格式代码:

%A 用文件权限代码来表示,如:-rw-r--r--

%a 用8紧致数字来表示文件权限

%b 占用区块数量

%B 用 %b计算区块数量是,每个区块的大小。预设是512

%D 用16进制表示设备的编号

%d 用10进制表示设的编号

%F 文件的形态

%f raw mode 以16进制表示

%G文件拥有者组名

%g文件拥有者群组编号

%h 文件硬链接的数量

%n文件名

%s 文件大小

AT=$(stat -c %x test.sh) MT=$(stat -c %y test.sh) CT=$(stat -c %z test.sh)

MFL=$(stat -f -c %l /dev/sda1)

 

特殊属性,可以使用chattr lsattr进行管理

chattr +属性代码 文件 增加特殊属性

chattr =属性代码 文件 设定特殊属性

chattr -属性代码 文件 删除特殊属性

属性代码有AacDdijSu

lsattr 文件

 

11.比较文件:

diff 选项 文件1 文件2

shopt -s -o nounset  -----要求变量要先设值才能调用。 

CVS,SVN,Git  

patch文件,补丁文件。

使用diff产生patch文件的基本语法:

diff 选项 原文件 新文件 >patch文件

 

乙拿到patch文件后,只要把它和原文件放在一起,然后利用patch工具,即可产生修改后的新文件。

用法:patch -p0 <mksock.diff  选项-p表示要移去的目录层次, 0 表示不移去任何文件名前的目录。

实际上:甲会把原来mksock.c放在一个目录中,如A,然后把源代码复制一份放在B目录。

甲在B目录中进行源代码的修改。那么甲产生patch的方式是:

diff -uNr A B > mksock2.diff

-u选项表示使用unified context格式--产生小而紧致的差异文件。, -r表示递归的对比两个目录中所有的子目录和文件。

-N表示如果有不存在的文件则视为空文件。

假设乙的原始代码目录是C,乙把拿到的patch文件和C目录放在同一层。

patch -p1 < ../mksock2.diff.

 

12.搜寻文件内容

最常用的就是:

grep -q 关键词 文件 :如果文件中含有关键词,则$?传回0,否则传回非0值。

选项-q表示搜寻是不产生任何信息。

grep -qe '^anonymous_enable=NO' /etc/vsftpd.conf 

选项-e表示使用样式比对,

grep -qE "usb|uhci|ohci" /proc/modules

选项-E表示使用扩展样式。

awk

 

13.建立临时文件:

在脚本执行过程,经常需要用一个文件来暂时存储程序处理的结果。:

建立临时盘的注意事项:

a.不同的脚本建立的临时盘不能重复,以免造成意外影响。唯一性

b、程序结束前要清理临时盘,以免在系统中留下垃圾文件

C、临时盘可能包含有机密数据,建立临时盘时,应注意文件权限及程序安全。

D、尽量使用系统机制来建立临时盘。

使用TMP_file="tmp/tmp.$$"

缺点:忘记脚本结束钱清理临时文件。使用进程编号变量$$不够随机,只有65535种可能。

使用系统建立临时盘的机制。

mktemp 选项 临时盘模板   :如果建立临时盘成功,则$?传回0,如果失败则传回1.

mktemp 直接执行,它会再/tmp目录下产生tmp.XXXXXX(必须为大写X)临时文件。文件名末6个字符,有现行的进程

编号和随机的英数字组成。

TMP_file=$(mktemp)

临时文件模板: mktemp /tmp/tfile.XXXXXX  .临时文件模板一定要是文件名.XXXXXX的格式,(少一个

x都不行)

-q 选项。在发生错误是不产生任何信息。

-p可指定建立临时盘的前置路径的文件名称。

-t 按mktemp预先设置的方式,决定临时盘的路径。会先检查环境变量TMPDIR是否有定义。

如果有,则以该变量的内容为临时盘的路径,如果无,则使用选项-p所指定的前置路径。

如果未使用-p,则默认在/tmp目录下建立临时盘。

-d选项,建立临时目录

临时文件使用完后。记得做删除的操作:

#1建立临时文件

TMP_file=${mktemp)

 

#2使用临时文件

echo "hello world" > $TMP_file

 

#3清理

[ -f "$TMP_file" ] && rm -f $TMP_file

 

14.复制文件

设计脚本是,经常要复制文件。

cp 选项 来源文件 目标文件

-f选项 :强制覆盖

-p,a选项 保持来源文件的属性。如文件所有者,群组,权限,文件时间等。

a选项运用在备份是,特别好用。

 

15。大小写文件名互换

16.转换编码

locale

转换编码的工具: iconv -f 来源文件的编码 -t 目的文件的编码 来源文件 -o 目的文件

iconv -f utf8 -t gbk utf8.txt -o gbk_2.txt

 

find $(pwd) -type f > dir-struc.txt

posted @ 2014-12-31 11:28  sky.zhao  阅读(189)  评论(0)    收藏  举报