Bash入门之管好文件

366 阅读10分钟

Linux基金会发布了标准文件系统架构(FHS,Filesystem Hierarchy Standard),该规范规定了Linux目录下该有哪些目录,以及这些目录下应该放置什么数据。 image.png

  • pwd,返回当前工作目录

  • cd,切换工作目录,change directory

    • . ,当前工作目录
    • ..,上一级目录
    • -,前一个工作目录
    • ~,用户的家目录
    • ~admin,用户admin的家目录 image.png
  • mkdir,创建目录,make directory

    • mkdir -p /tmp/dirlevel01/dirlevel02,创建嵌套目录
  • rmdir,删除目录,remove directory,但请注意,rmdir只能删除非空目录

  • rm,删除文件,remove

    • rm demo.sh,删除单个文件
    • rm hello.sh test.sh,删除多个文件
    • rm -R dir01/,或者rm -r dir01/,或者rm --recursive dir01/,删除整个目录及目录下的所有文件,系统默认会询问用户是否确定删除,得到用户的肯定回复后才会删除
    • rm -fR dir01/--force,删除整个目录及目录下的所有文件,强制删除,不需要用户的二次确认。 test.gif image.png image.png
  • touch,创建文件

    • touch test,创建一个没有任何内容的空文件 image.png
  • ls,list

    • ls -a,列出包含隐藏文件的所有文件
    • ls -l,以长文件格式列出文件
      • ls -l hello.sh
    • ls -al,以长文件格式列出包含隐藏文件在内的所有文件
    • 文件类型
      • d,目录文件
      • f,普通文件
      • c,字符设备文件
      • b,块设备文件
      • l,符号链接文件
        test.gif image.png
  • chmod,修改文件访问权限,如文件拥有者权限、文件从属用户组的用户权限、其他用户权限。

  • chown

    • chown root hello.sh,修改文件hello.sh的拥有者
    • chown :root hello.sh,修改文件hello.sh的从属用户组
    • chown root:root hello.sh,修改文件hello.sh的拥有者、从属的用户组 test.gif
  • cp,拷贝,copy

    • cp /tmp/hello.sh ~,将hello.sh拷贝至用户的家目录
    • cp /tmp/hello.sh ~/test.sh,将hello.sh拷贝至用户的家目录,并重命名为test.sh
    • cp /tmp/hello.sh /tmp/test.sh ~,将多个文件(hello.shtest.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拷贝文件时,文件属性(拥有者、从属组、访问权限位)都有可能发生变化,导致无法修改或访问拷贝的文件。因此,如果想原原本本地将文件拷贝过来,可以使用选项-pimage.png test.gif image.png image.png
  • mv,移动,move

    • mv 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可以实现重命名的功能。 image.png image.png
  • ln -s,符号链接,和Windows系统中的快捷方式很像

    • ln -s hello.sh hello_slink,给源文件hello.sh创建符号链接,链接名为hello_slink,一旦删除源文件,符号链接将断裂。
    • ls -il,查看文件的inode-number image.png test.gif
  • ln,硬链接

    • ln hello.sh hello_hardlink,给源文件hello.sh创建硬链接,链接名为hello_hardlinktest1.gif 硬链接和符号链接,虽然它们的名字里都有“链接”二字,但实际上二者相当不一样,不仅仅因为表现出的特征不一样,更重要的是,二者的原理也大相径庭。
      要理解硬链接,首先需要了解Linux中文件是怎么存储的。
      在Linux中,划分磁盘分区并进行格式化时,整个分区会分成两部分,一部分是Inode table,另一部分是Data Block;Linux中的每个文件也分成两部分,一部分是文件的唯一标识inode-number及其它属性,另一部分是文件的实际数据。每个文件必须有一个inode,inode中保存了除文件名外的所有文件信息,包括文件inode-number及其他属性,inode table存放着inode所包含的全部信息,文件的实际数据保存在Data Block中。更多可参考这篇文章
      test1.gif 表面上,我们找到文件名,打开文件。实际上,Linux系统中的这个过程分了3步:
  1. 系统通过文件名找到文件inode-number
  2. 根据inode-number找到对应的inode;
  3. 根据inode中的信息,找到文件所在的block并读出数据。 image.png 好了,了解了Linux中文件是怎么存储的,那么硬链接就好理解了。 硬链接,就是多个文件名对应通过一个inode-number
  • ls -il-i,查看文件的inode-number image.png image.png image.png
  • tar,打包文件,tar是一个古老的命令,最初的目的是将文件备份到磁带上,tape archive
    • tar -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不会压缩文件。
test3.gif 如下图所示,最终得到的打包文件sample.tar,其大小比打包前的所有文件大小之和都要大,这是因为tar命令打包文件时会添加额外信息,这也证明了tar命令不会压缩文件。 image.png demo.gif

  • gzip,压缩文件
    • gzip sample.tar,压缩后的文件会替代源文件
    • gzip -d sample.tar.gz
      • -d,同--decompress--uncompress,解压文件,解压后的文件会替代压缩文件

hello.gif gzip命令可以提供高效压缩,但不提供打包功能,所以gzip只能单个地压缩文件,而不能将多个文件压缩到一个文件、不能压缩一个目录。因此,gzip往往和tar命令一起使用,tar命令提供了特殊的选项来调用gzip命令。

  • tar -czf sample.tar.gz file01 file02 file03,将file01fil02file03这3个文件先打包再压缩。
    • -z,同--gzip
  • tar -xzf sample02.tar.gz,将sample01.tar.gz这个压缩包先解压再解包
    • -z,同--ungzip

demo.gif 另外,压缩的时候可以设置压缩比,压缩比是一个整数,范围在1~9之间。其中,1是最低的压缩比,意味着压缩后的文件是最大的,压缩速度是最快的;9则是最高的压缩比,意味着压缩后的文件是最小的,压缩速度是最慢的。如果不设置压缩比,默认压缩比是6

  • gzip -1 file01
  • gzip file02
  • gzip -9 file03 image.png
  • locate,查找文件
    • 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即可解决这个问题。 4.gif
  • 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,文件大小小于2k
          • 2k,文件大小等于2k
        • M,同1024k
        • G,同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的所有文件 根据文件名、文件类型查找文件.gif 根据时间属性查找文件1.gif 根据时间属性查找文件2.gif 根据时间属性查找文件3.gif image.png image.png 根据文件大小查找文件.gif 根据拥有者、从属的用户组查找文件.gif 根据文件权限查找.gif 上面已经讲过,可以根据文件名、文件类型、时间属性、文件大小、文件拥有者、从属用户组、文件权限这些条件来查找,当然也可以将这些条件组合起来查找文件,通过与(-a,and)、或(-o,or)、非(!)来组合,如find /tmp/test \( -size +1k -a -size -10M -a -type f \) -ls,列出/tmp/test目录下的文件大小介于1k~10M之间的所有普通文件。 根据联合条件查找.gif
  • 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分钟内进行过修改的所有目录文件全部打包,打包名与原目录同名。

test.gif

  • 通配符
    • *,代表任意长度字符串
      • rm -rf /tmp/test/*.txt,删除/tmp/test下,文件名字以.txt为后缀的所有文件。
    • ?,代表任意单个字符
      • ls -l /bin/??sh,列出/bin目录下,文件名字包含四个字符且以sh结尾的所有文件。
    • []
      • [c1-c2],有序字符序列,用以匹配任意单一字符。比如有序数字序列,[1-4],则包括1234;比如有序英文字母序列,[a-c],则包括abc
        • cp /tmp/test/file[1-4] /tmp/demo,将/tmp/test下的file1file2file3file4复制到/tmp/demo目录下
      • [c1,c2,c3...cn],字符列表,用以匹配任意单一字符。
        • rm -f /tmp/test/script[1,a,d].sh
    • {},如{string1,string2,string,...stringn}字符串列表,用来匹配任意单个字符串。
      • rm -f {script,file}*.sh,删除以scriptfile开头的、.sh结尾的所有文件
    • !,取反
      • tar -cf file.tar /tmp/test/file[!0-9].txt,除file0.txtfile1.txtfile2.txtfile3.txtfile4.txtfile5.txtfile6.txtfile7.txtfile8.txtfile9.txt外,将/tmp/test下名字以file开头的所有文件打包到file.tar

通配符.gif

test.gif