Shell Scripting to Compress目录

时间:2018-04-22 09:15:40

标签: linux bash shell sh

  • $ 1是要压缩的文件/文件夹
  • 输出文件名是相同的名称,加上当前日期和分机
  • 如果输出名称存在,则只需发出警告

示例:

./ cmp.sh / home / user

将是/ home / user /home/user_2018-03-11.tar.bz2

我已经领先,但我被困了

#!/bin/bash

if ["$1" == ""]; then
echo "Help : To compress file use argument with directory"
exit 0
fi


if [[ -f "$1" || -d "$1" ]]; then
tar -cvjSf $1"_"$(date '+%d-%m-%y').tar.bz2 $1
fi

但输出是_22-04-2018.tar.bz2

2 个答案:

答案 0 :(得分:3)

我看到你正在使用引号来避免下划线被用作变量名称的一部分的问题。因此,虽然$1是位置参数,但$1_是您未在脚本中设置的变量。您可以使用花括号来避免此问题,例如${1}。大括号内的任何内容都是变量名称的一部分,因此${1}_起作用。这种表示法优于$1"_",它将用户提供的变量留在引号之外。 (当然,"$1"_也可以完成这项工作。)

此外,在变量中设置文件名可能更安全,然后将其用于满足您的所有需求:

#!/bin/bash

if [ -z "$1" ]; then
  echo "Help : To compress file use argument with directory"
  exit 0
fi

filename="${1}_$(date '+%F').tar.bz2"

if [ -e "$filename" ]; then
  echo "WARNING: file exists: $filename" >&2
else
  tar -cvjSf "$filename" "$@"
fi

的变化:

  • if条件下方括号周围需要空格
  • 当你可以测试空字符串的等效性时,-z更干净,但你也可以测试[ $# -eq 0 ],计算所提供的参数,
  • 使用$filename确保您的测试和tar将始终使用相同的名称,即使脚本在午夜运行,并且更具可读性,
  • 应始终引用变量。

另外,您确定tar的-S选项吗?在我的系统上,该选项提取稀疏文件,仅与-x一起使用。

另外,我应该注意到,当我重写它时,此脚本中没有任何内容特定于 bash ,并且它也应该可移植到POSIX shell(灰/短划线/等) )。 Bash很棒,但它并不普及,如果通过你的学习之旅你可以学到两者,它将为你提供跨多种操作系统和环境的有用技能。

答案 1 :(得分:1)

使用-z开关检查是否为空白

#!/bin/bash 
if [[ -z "$1" ]]; then 
  echo "Help : To compress file use argument with directory" 
  exit 0 
fi 
if [[ -f "$1" || -d "$1" ]]; then 
  tar -cvjSf $1"_"$(date '+%d-%m-%y').tar.bz2 $1 
fi