Linux脚本练习之script002-自动将用户主目录下所有小于 5KB 的普通文件打包成 `xx.tar.gz`。

Posted 二木成林

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Linux脚本练习之script002-自动将用户主目录下所有小于 5KB 的普通文件打包成 `xx.tar.gz`。相关的知识,希望对你有一定的参考价值。

script002

题目

编写一个脚本,自动将用户主目录下所有小于 5KB 的普通文件打包成 xx.tar.gz

分析

本题考查的知识点:

  • 自定义函数
  • 变量与局部变量
  • find 命令
  • 命令替换
  • grep 命令
  • for 循环
  • 多分支条件语句
  • tar 命令

思路:

  • 通过 find 命令找到 /home 目录下所有小于 5kb 的普通文件。
  • 利用 grep 命令排除掉隐藏文件和压缩包文件。
  • 然后通过 for 循环找到的所有普通文件,一一对它们进行压缩打包。

脚本

#!/bin/bash

# 创建变量
# 目标目录
DEST_HOME="/home"
# 设定目标大小,表示小于 5kb
DEST_SIZE="-5k"

##
# 打包指定目录下指定大小的文件
##
function package_file() 
    # 获取指定目录下指定大小的所有普通文件,注意排除隐藏文件和已经打包过的文件
    # 如果打包文件已经存在,则不要再继续打包了,不然会出现 .tar.gz、.tar.gz.tar.gz、.tar.gz.tar.gz.tar.gz 这样的包
    # find "$DEST_HOME" -type f -size $DEST_SIZE 表示查找所有小于 5kb 的普通文件
    # grep -v "/\\\\." 表示排除掉隐藏文件
    # grep -v ".tar.gz" 表示排除掉已经是压缩包的文件
    local dest_files=$(find "$DEST_HOME" -type f -size $DEST_SIZE | grep -v "/\\\\." | grep -v ".tar.gz")
    # 循环遍历这些普通文件,将其进行打包
    for file in $dest_files ; do
        # 拼接打包后的文件路径
        local tar_path="$file.tar.gz"
        # 所以对压缩包路径表示的文件判断是否存在,如果存在则打印提示信息,否则则进行打包
        if [ -e "$tar_path" ]; then
          echo "文件 $tar_path 已经存在!"
        else
          # 进行压缩打包
          # 注意,不加 -v 选项是为了不打印命令执行信息,只打印我们自己的日志;加上 -P 选项是因为我们要以绝对路径表示的文件来进行压缩
          tar -zcPf "$tar_path" "$file"
          echo "打包文件 $file 成功!"
        fi
    done


##
# 主函数
##
function main() 
  package_file


# 调用主函数
main

测试

查找 /home 目录下所有的普通文件如下:

执行脚本打印的日志:

执行脚本后,打包后再查找结果如下:

以上是关于Linux脚本练习之script002-自动将用户主目录下所有小于 5KB 的普通文件打包成 `xx.tar.gz`。的主要内容,如果未能解决你的问题,请参考以下文章

Linux脚本练习之script015-实现禁止和允许普通用户登录系统。

Linux脚本练习之script008-将个人用户下任意目录下所有文件的扩展名改为 `.bak`。

Linux脚本练习之script025-判断用户输入的参数是否为正整数。

Linux脚本练习之script037-打印无密码用户。

Linux脚本练习之script038-统计一共有多少个普通用户。

Linux脚本练习之script024-判断用户输入文件路径,显示其文件类型(普通,目录,链接,其它文件类型)。