《LinuxShell脚本攻略》笔记,Chap-3:以文件之名
简介
Unix将操作系统中的一切都视为文件。
生成任意大小的文件
由于各种原因,可能需要生成一个包含随机数据的文件。
#dd命令会克隆给定的输入内容,然后将一模一样的副本写到输出
#如果不指定if,dd会从stdin中读取输入;如果不指定of,dd会输出到stdout
#/dev/zero是一个字符设备,它会不断返回0值字节(\0)
dd if=/dev/zero of=junk.data bs=1M count=1
文本文件的交集与差集
#comm命令用于两个文件之间的比较
#交集(intersection),差集(set difference), 求差
#comm必须使用排过序的文件作为输入
echo -e "1\n2\n3" > A.txt && echo -e "3\n2\n3" > B.txt
sort -n A.txt -o A.txt && sort -n B.txt -o B.txt
comm A.txt B.txt
#输出第一列为A独有,第二列为B独有,第三列为交集
comm A.txt B.txt -1 -2
#-1从输出中删除第一列,-2删除第二列,-3删除第三列
查找并删除重复文件
#重复文件指的是那些虽然名字不同但内容却一模一样的文件
ls -lS #以文件大小排序,识别大小相等的文件
md5sum #接下来计算这些文件的校验和
创建长路径目录
mkdir -p /home/zhang/1/22/333 2>/dev/null
文件权限、所有权和粘滞位
#用户(user),用户组(group),其他用户(other)
ll ./*
#d目录,c字符设备,b块设备,l符号链接,s套接字,p管道,-普通文件
#用户还有一个称为setuid(S)的特殊权限,它出现在用户的x位置
#setuid权限允许用户以其拥有者的权限来执行可执行文件,即便这个文件是由其他用户运行的
-rwSrw-r--
#组也拥有一个setgid(S)权限,它出现在组的x位置
#它允许以同该目录拥有者所在组相同的有效组权限来运行可执行文件
-rwxrwSr--
#目录有一个特殊权限,叫做粘滞位(sticky bit)(T或t),出现在其他用户的x位置
#当一个目录设置了粘滞位,只有创建该目录的用户才能删除目录中的文件,即便group和other有w权限
-rwxr--rwT
chmod u=rwx g=rw o=r file1
chmod u+x g-w file2
chmod 744 file3
chmod a+x . -R #以递归方式设置权限
chown user.group . -R #以递归方式设置所有权
chmod a+t dir1 #设置粘滞位
chmod +s fiel4
chown root.root file4
chmod +s file4
./file4 #每次file4都是以root运行
#setuid的使用不是无限制的,它只能应用在Linux ELF格式二进制,而不能用于脚本文件。
创建不可修改文件
#不可修改(immutable),是保护文件不被修改的安全手段之一。
#一旦文件被设置为不可修改,任何用户(包括root)都不能修改,除非将其不可修改属性移除
chattr #修改文件在Linux第二扩展文件系统(E2fs)上的特有属性
chattr +i file1 #这样就无法删除file1
chattr -i file1
批量生成空白文件
#touch命令可用来生成空白文件,如果文件存在,则可以用它修改文件的时间戳
for name in {1..100}.txt;do
touch $name
done
touch -a/-m #更改文件访问/修改时间
touch -d "Thu Oct 31 14:20:13 CST 2017" file1 #指定特定时间戳
查找符号链接及其指向目标
#符号链接(软链接)只不过是指向其他文件的指针
ln -s /usr/bin /bin
ls -l / | grep "^l"
find / -maxdepth 1 -type l
readlink /bin #找出链接目标
列举文件类型统计信息
#在Unix/Linux系统中,文件类型并不是由文件扩展名决定的
file /etc/passwd
file -b /etc/passwd
环回文件与挂载
#环回文件系统是指那些在文件中而非物理设备中创建的文件系统
dd if=/dev/zero of=loopback.file bs=1G count=1
mkfs.ext4 loopback.file
mount -o loop loopback.file /mnt/loopback #-o loop来挂载环回文件
df -h
umount /mnt/loopback
#将ISO文件作为环回文件挂载
mount -o loop linux.iso /mnt/iso
生成ISO文件以及混合ISO
#可引导光盘自身具备引导能力,也可以运行操作系统或其他软件。不可引导光盘则做不到这些。
cat /dev/cdrom > /dev/sdc #sdc指U盘
dd if=/dev/cdrom of=/dev/sdc #将ISO写入usb存储设备
mkisofs -V "Label" -o /dev/sdc /dev/cdrom
cdrecord -v dev=/dev/cdrom image.iso
查找文件差异并进行修补
#补丁文件(patch file)
#diff命令可以生成差异文件
diff -u file1 file2 #一体化形式输出
diff -u file1 file2 > diff.patch
patch -p1 file1 < diff.patch #得到file2
patch -p1 file2 < diff.patch #得到file1
patch -R file1 < diff.patch; patch -R file2 < diff.patch #还原
#diff也能够以递归的形式作用于目录,它对目录中所有内容生成差异输出
diff -Naur dir1 dir2
#-N将所有确实文件视为空文件, -a将所有文件视为文本文件
#-u生成一体化输出, -r遍历目录下所有文件
head与tail
head file1; tail file1 #head与tail默认打印10行
head -n 5 file1; tail -n 6 file1 #指定行数
head -n -5 file1 #打印除了最后5行外所有行
tail -n +(5+1) file1 #打印除了开始5行外所有行
tail -f /var/log/nginx/access.log #--follow,动态关注文件
只列出目录的其他方法
ls -d .
ls -l . | grep "^d"
ls -F . | grep "/$"
find . -maxdepth 1 -type d
pushd和popd
#在命令行中使用pushd和popd快速定位,pushd和popd以栈的方式运作
#当没有鼠标时,复制粘贴就不怎么实用了
#pushd和popd可以用于在多个目录之间进行切换而无需复制并粘贴目录路径
pushd /home/user1; pushd /home/user2; pushd /home/user3 #将路径添加到栈
pushd +2 #切换到/home/user3
popd #移除最近添加入栈的目录
cd /root; cd /home/user
cd - #回到上次的目录
cd .. #切换到上一级目录
cd ~ #切换到用户主目录
统计文件的行数、单词数、字符数
#wc(word count),是一个统计工具
wc -l file1 #统计行数
wc -w file1 #统计单词数
wc -c file #统计字符数
wc -L file #打印最长行长度
wc file1 #行、单词、字符数
目录树
#tree命令是以图形化的树状结构打印文件和目录,在Linux发行版中默认未安装
yum install -y tree
tree /home/zhang
tree /home/zhang -P "*.sh" #只标记出.sh文件
tree /home/zhang -I "*.sh" #标记出除.sh文件外所有文件
tree /home/zhang -h #显示大小
tree /home/zhang -H http://localhost -o tree.html #以html形式输出目录树