本文整理了Linux文件与目录的管理相关知识
.
和..
每个目录下都必有两个文件,.
和..
,它们分别代表着当前目录和上级目录,这两个目录由系统创建和删除
$ ls -a
. ..
每个用户都有自己独立的目录,一般是/home/用户名
,可以用env命令查看环境变量HOME的值来看当前用户的主目录路径。
$ env | grep HOME
HOME=/home/featherm
大多数的shell都会把符号~
解释成主目录的路径,所以可以用~
代替主目录,但是要注意的是,但是~
只是shell解释的,编写程序涉及路径的时候,最好不要用~
,因为所用的程序函数不一定支持~
的解释。
路径分隔符使用的是/
(不同于Windows用\
),以根目录/
开头的路径为绝对路径,如/home/featherm
;否则为相对路径,相对路径是指相对于当前目录的路径,如:当前目录下有一文件1.txt,则路径1.txt
指的是当前目录下的1.txt
当前工作目录是进程属性的一部分,每个进程都有
在shell中可以用pwd命令打印当前工作目录:
$ pwd
/home/featherm/tmp
可用cd命令改变当前工作目录,如切换到根目录:
$ cd /
$ pwd
/
若不传递参数,则回到主目录:
$ cd
$ pwd
/home/featherm
cd是shell的一个内部命令,功能由shell完成
创建目录用命令mkdir,如下创建tmp目录:
$ mkdir tmp
添加选项-p,可自动创建路径中不存在的目录,如:
$ mkdir -p database/2019/6/17/log
删除目录用命令rmdir:
$ rmdir tmp
使用rmdir时,被删除的目录必须是空的,如果想删除非空目录,可以使用前一篇文章中介绍的rm -r dir
前一篇文章已经介绍了,使用cp命令,添加-r选项即可:
$ cp -r dir1 dir2
选项-v,冗长(Verbose)模式:可以实时列出正在复制的n文件
选项-u,增量拷贝(Update),一般用于备份目录。可根据文件的时间戳,不拷贝相同的或者过时的版本的文件,以提高速度。
命令touch可将文件最后一次修改时间设置为当前时间,但不修改文件的内容,如touch 1.txt
关于增量拷贝,Linux下还有一款工具:rsync,该工具可以远程同步目录,具体用法查看man手册:
$ man rsync
目录遍历主要用到命令find,该命令从指定的查找范围开始,递归地查找子目录,对满足条件的文件或目录,执行指定的动作
例:
find ver1.d ver2.d -name '*.c' -print
*.c
匹配整个路径名与正则表达式pattern匹配
例如,打印tmp目录下的所有文件:find tmp -type f -print
指定文件大小,单位有c(字符),b(块,512字节),k,M,G,默认为b
如:大于10M:+10M
、小于10M:-10M
、等于10M:10M
文件的最近修改时间离现在有多少天
所匹配文件最近修改时间比file要晚,也就是所匹配的文件要比file新
其余可查阅man手册
可以用()
、-o
、!
表示条件的“与(且)”、“或”、“非”
打印匹配的文件的路径名
对匹配的目标执行一条命令。在-exec及随后分号之间的内容作为一条命令
与-exec类似,但每一条命令执行前需操作员确认
注意:动作也可以有多个
find . type -d -print
从当前目录开始,打印所有目录路径find / -name 'stud*' -type d -print
打印名字与stud*
匹配,且为目录的路径find / -type f -mtime -10 -print
查找根目录下最近10天内修改过的普通磁盘文件find . ! -type -d -links +2 -print
从当前目录开始查找link数大于2的非目录文件find~ -size +100k '(' -name core -o -name '*.tmp' ')' -print
从主目录开始查找大于100KB的名叫core 或者 有.tmp后缀的文件或目录等find ~ -size +100k \( -name core -o -name '*.tmp' \) -print
同上find /lib /usr -name 'libc*.so' -exec ls -lh {} \;
对匹配条件的路径执行ls命令,其中的{}
代表匹配的路径find src -name '*.c' -exec grep -n -- --help {} /dev/null \;
搜索src目录下的匹配*.c
的文件,并用grep搜索文件中的字符串--help
,显示出行号(-n选项)。由于grep命令操作一个文件时,不显示文件名,故加上一个“虚拟的”文件/dev/null
(该文件是一个特殊的设备文件,读取不到数据,是空的,写入什么数据都被丢弃)上面最后一个例子的效率特别低,因为每匹配到一个路径,都要创建一个进程来执行grep命令。
可以结合xargs命令提高效率,高效率的方法应该如下:
find src -name '*.c' -print | xargs grep -n -- --help
xargs命令会把标准输入追加到它的第一个参数(grep)后面,再作为一个命令执行。
如果标准输入的数据量很大,xargs指定的处理程序会启动多个进程进行,每个进程处理一批,一般是几千个参数(命令行参数占满128K字节)。可以用-n选项指定每批处理最多多少个参数
xargs常用场景:
rm -f *.dat
文件名*.dat
展开失败,文件过多,超出缓冲区空间大小,可用xargs改造:ls | grep ".dat$" | xargs rm -f
find . -name CVS -exec rm -rf {} \;
改为:find . -name CVS -print | xargs rm -rf
tar最早为顺序访问的i磁带机设备而设计(Tape ARchive 磁带归档),用于保留和恢复磁带上的文件,可用来打包和压缩文件
用法:tar ctxv[f device] file-list
第一个字母选项指定功能,必须指定,有以下三个:
常用方法:
tar cvf my.tar *.[ch] makefile
tar cvf work.tar work
tar cvzf work.tar.gz work
(文件名的后缀只是惯例,无强制要求)tar xvf work.tar.gz
gzip算法的执行速度快,但压缩比率不如bzip2;bzip2执行速度要不gzip慢很多,压缩比率较好