Linux基金会发布了标准文件系统架构(FHS,Filesystem Hierarchy Standard),该规范规定了Linux目录下该有哪些目录,以及这些目录下应该放置什么数据。
-
pwd,返回当前工作目录 -
cd,切换工作目录,change directory.,当前工作目录..,上一级目录-,前一个工作目录~,用户的家目录~admin,用户admin的家目录
-
mkdir,创建目录,make directorymkdir -p /tmp/dirlevel01/dirlevel02,创建嵌套目录
-
rmdir,删除目录,remove directory,但请注意,rmdir只能删除非空目录 -
rm,删除文件,removerm demo.sh,删除单个文件rm hello.sh test.sh,删除多个文件rm -R dir01/,或者rm -r dir01/,或者rm --recursive dir01/,删除整个目录及目录下的所有文件,系统默认会询问用户是否确定删除,得到用户的肯定回复后才会删除rm -fR dir01/,--force,删除整个目录及目录下的所有文件,强制删除,不需要用户的二次确认。
-
touch,创建文件touch test,创建一个没有任何内容的空文件
-
ls,listls -a,列出包含隐藏文件的所有文件ls -l,以长文件格式列出文件ls -l hello.sh
ls -al,以长文件格式列出包含隐藏文件在内的所有文件- 文件类型
d,目录文件f,普通文件c,字符设备文件b,块设备文件l,符号链接文件
-
chmod,修改文件访问权限,如文件拥有者权限、文件从属用户组的用户权限、其他用户权限。 -
chownchown root hello.sh,修改文件hello.sh的拥有者chown :root hello.sh,修改文件hello.sh的从属用户组chown root:root hello.sh,修改文件hello.sh的拥有者、从属的用户组
-
cp,拷贝,copycp /tmp/hello.sh ~,将hello.sh拷贝至用户的家目录cp /tmp/hello.sh ~/test.sh,将hello.sh拷贝至用户的家目录,并重命名为test.shcp /tmp/hello.sh /tmp/test.sh ~,将多个文件(hello.sh,test.sh)拷贝至用户的家目录,多个文件用空格分隔。cp -r /tmp/dir01 ~,将dir01目录拷贝至用户家目录,包括dir01目录下的所有文件。\cp -f /tmp/hello.sh /tmp/dir01/hello.sh,使用cp拷贝文件时,如果目标目录中包含同名文件,系统会默认询问用户是否同意覆盖,如果用户同意,cp命令会覆盖这些文件;如果目标目录中包含批量同名文件,使用\cp -f命令来强制覆盖所有同名文件。cp -p /tmp/hello.sh /tmp/dir01/hello.sh,使用cp拷贝文件时,文件属性(拥有者、从属组、访问权限位)都有可能发生变化,导致无法修改或访问拷贝的文件。因此,如果想原原本本地将文件拷贝过来,可以使用选项-p。
-
mv,移动,movemv dir02/demo.sh dir01/,移动文件mv dir02/hello.sh dir02/test.sh dir02/,移动多个文件,多个文件用空格分隔mv /tmp/dir01 ~,移动目录mv -f hello.sh dir01,如果目标目录中包含同名文件,使用-f选项可以强制覆盖同名文件mv dir01 dir02,Linux系统中没有重命名的命令,但mv可以实现重命名的功能。
-
ln -s,符号链接,和Windows系统中的快捷方式很像ln -s hello.sh hello_slink,给源文件hello.sh创建符号链接,链接名为hello_slink,一旦删除源文件,符号链接将断裂。ls -il,查看文件的inode-number
-
ln,硬链接ln hello.sh hello_hardlink,给源文件hello.sh创建硬链接,链接名为hello_hardlink。硬链接和符号链接,虽然它们的名字里都有“链接”二字,但实际上二者相当不一样,不仅仅因为表现出的特征不一样,更重要的是,二者的原理也大相径庭。
要理解硬链接,首先需要了解Linux中文件是怎么存储的。
在Linux中,划分磁盘分区并进行格式化时,整个分区会分成两部分,一部分是Inode table,另一部分是Data Block;Linux中的每个文件也分成两部分,一部分是文件的唯一标识inode-number及其它属性,另一部分是文件的实际数据。每个文件必须有一个inode,inode中保存了除文件名外的所有文件信息,包括文件inode-number及其他属性,inode table存放着inode所包含的全部信息,文件的实际数据保存在Data Block中。更多可参考这篇文章。
表面上,我们找到文件名,打开文件。实际上,Linux系统中的这个过程分了3步:
- 系统通过文件名找到文件
inode-number; - 根据
inode-number找到对应的inode; - 根据inode中的信息,找到文件所在的block并读出数据。
好了,了解了Linux中文件是怎么存储的,那么硬链接就好理解了。 硬链接,就是多个文件名对应通过一个
inode-number。
ls -il,-i,查看文件的inode-numbertar,打包文件,tar是一个古老的命令,最初的目的是将文件备份到磁带上,tape archivetar -cf sample.tar demo.sh hello.sh test.sh-f,指定打包文件名,将打包文件名后缀.tar,这样别人一看到这个文件就知道是打包文件-c,同--create,表示创建打包文件
tar -tf sample.tar-t,同--list,列出打包文件中的所有文件名
tar -f sample.tar --delete test.sh--delete,从打包文件中删除指定文件,注意,这里是长选项,所以用两个连字符--
tar -f sample.tar -r file01-r,同--append,在打包文件中追加新文件
tar -f sample.tar -A sample01.tar-A,合并两个打包文件
tar -xf sample01.tar-x,同--extract,表示解包,默认解包到当前目录
tar -xf sample01.tar -C /tmp/dir01-C,解包到指定目录
tar命令的原理很简单,就是将多个文件前后连接成一个大文件,tar不会压缩文件。
如下图所示,最终得到的打包文件
sample.tar,其大小比打包前的所有文件大小之和都要大,这是因为tar命令打包文件时会添加额外信息,这也证明了tar命令不会压缩文件。
gzip,压缩文件gzip sample.tar,压缩后的文件会替代源文件gzip -d sample.tar.gz-d,同--decompress或--uncompress,解压文件,解压后的文件会替代压缩文件
gzip命令可以提供高效压缩,但不提供打包功能,所以gzip只能单个地压缩文件,而不能将多个文件压缩到一个文件、不能压缩一个目录。因此,gzip往往和tar命令一起使用,tar命令提供了特殊的选项来调用gzip命令。
tar -czf sample.tar.gz file01 file02 file03,将file01、fil02、file03这3个文件先打包再压缩。-z,同--gzip
tar -xzf sample02.tar.gz,将sample01.tar.gz这个压缩包先解压再解包-z,同--ungzip
另外,压缩的时候可以设置压缩比,压缩比是一个整数,范围在
1~9之间。其中,1是最低的压缩比,意味着压缩后的文件是最大的,压缩速度是最快的;9则是最高的压缩比,意味着压缩后的文件是最小的,压缩速度是最慢的。如果不设置压缩比,默认压缩比是6。
gzip -1 file01gzip file02gzip -9 file03locate,查找文件locate .tar,查找名字中包含.tar字符的所有文件locate查找速度很快,因为它查找时不是遍历硬盘,而是查找数据库。/var/lib/mlocate/mlocate.db,这个数据库记录了Linux系统中的所有文件名,但这个数据库不是实时更新,默认是每天更新一次,所以locate查找文件时可能会遇到:查找到了已经删除的文件 或 刚刚创建的文件查找不到。updatedb,可以更新/var/lib/mlocate/mlocate.db这个数据库 首次使用locate查找时,可能遇到问题:locate: 无法执行 stat () '/var/lib/mlocate/mlocate.db': 没有那个文件或目录,updatedb即可解决这个问题。
find,查找文件- 根据文件名查找文件
find / -name hello.sh,在根目录下根据文件名查找文件,注意哈,-name时,必须使用完整文件名来搜索,find / -name hello是找不到hello.sh的。
- 根据文件类型查找文件
find /bin -type l,列出/bin目录下所有的字符链接文件
- 根据时间属性查找文件
find /tmp/test -mtime -1 -ls,列出/tmp/test目录下,1天内文件内容有修改过的所有文件(包括目录文件)find /tmp/test -mmin -10 -ls,列出/tmp/test目录下,10分钟内文件内容有修改过的所有文件find /tmp/test -ctime -1 -ls,列出/tmp/test目录下,1天内文件属性有修改过的所有文件find /tmp/test -cmin -5 -ls,列出/tmp/test目录下,10分钟内文件属性有修改过的所有文件find /tmp/test -cmin -1 -ls,列出/tmp/test目录下,1分钟内文件属性有修改过的所有文件find /tmp/test -atime -1 -ls,列出/tmp/test目录下,1天内被读取或被执行过的所有文件find /tmp/test -amin -10 -ls,列出/tmp/test目录下,10分钟内被读取或被执行过的所有文件
- 根据文件大小查找文件
find /tmp/test -size -2k -ls,列出/tmp/test目录下,文件大小小于2k字节的所有文件find /tmp/test -size -5k -ls,列出/tmp/test目录下,文件大小小于5k字节的所有文件find /tmp/test -size +100c -ls,列出//tmp/test目录下,文件大小大于100字节的所有文件find /tmp/test -size 10M -ls,列出/tmp/test目录下,文件大小等于10M字节的所有文件c,字节。k,同1024c+2k,文件大小大于2k-2k,文件大小小于2k2k,文件大小等于2k
M,同1024kG,同1024M
- 根据文件拥有者、从属的用户组查找文件
find /tmp/test -user admin -ls,列出/tmp/test目录下拥有者为admin的所有文件find /tmp/test -group root -ls,列出/tmp/test目录下从属于root用户组的所有文件find /tmp/test -uid 1000 -ls,列出/tmp/test目录下用户id为1000的所有文件find /tmp/test -gid 0 -ls,列出/tmp/test目录下从属的用户组id为0的所有文件
- 根据文件权限查找文件
find /tmp/test -perm 764 -ls,列出/tmp/test目录下权限为764的所有文件find /tmp/test -perm 644 -ls,列出/tmp/test目录下权限为644的所有文件上面已经讲过,可以根据文件名、文件类型、时间属性、文件大小、文件拥有者、从属用户组、文件权限这些条件来查找,当然也可以将这些条件组合起来查找文件,通过与(
-a,and)、或(-o,or)、非(!)来组合,如find /tmp/test \( -size +1k -a -size -10M -a -type f \) -ls,列出/tmp/test目录下的文件大小介于1k~10M之间的所有普通文件。
- 根据文件名查找文件
find -exec,查找文件并执行动作,详细参考可参阅视频find /tmp/test \( -size +1k -a -size -10M -a -type f \) -exec rm -rf {} \;{}里填充的内容就是find /tmp/test \( -size +1k -a -size -10M -a -type f \)的结果\;,代表动作的结束
find /tmp/test \( -mmin -10 -a -type d \) -exec tar -cf {}.tar {} \;,将/tmp/test里10分钟内进行过修改的所有目录文件全部打包,打包名与原目录同名。
通配符*,代表任意长度字符串rm -rf /tmp/test/*.txt,删除/tmp/test下,文件名字以.txt为后缀的所有文件。
?,代表任意单个字符ls -l /bin/??sh,列出/bin目录下,文件名字包含四个字符且以sh结尾的所有文件。
[][c1-c2],有序字符序列,用以匹配任意单一字符。比如有序数字序列,[1-4],则包括1、2、3、4;比如有序英文字母序列,[a-c],则包括a、b、c。cp /tmp/test/file[1-4] /tmp/demo,将/tmp/test下的file1、file2、file3、file4复制到/tmp/demo目录下
[c1,c2,c3...cn],字符列表,用以匹配任意单一字符。rm -f /tmp/test/script[1,a,d].sh
{},如{string1,string2,string,...stringn}字符串列表,用来匹配任意单个字符串。rm -f {script,file}*.sh,删除以script、file开头的、.sh结尾的所有文件
!,取反tar -cf file.tar /tmp/test/file[!0-9].txt,除file0.txt、file1.txt、file2.txt、file3.txt、file4.txt、file5.txt、file6.txt、file7.txt、file8.txt、file9.txt外,将/tmp/test下名字以file开头的所有文件打包到file.tar。