【学习笔记】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