【问题标题】:How to check if file is tar file in Bash shell?如何在 Bash shell 中检查文件是否为 tar 文件?
【发布时间】:2018-05-07 18:08:25
【问题描述】:

我的问题是关于 Bash,Shell。我正在写一个脚本,我有以下问题: 当用户声明他或她会将文件提取到目录中时,我有一个案例。但是我必须测试是否存在,如果存在需要检查该文件是否为 *.tar 文件。我在检查文件是否可执行时搜索了类似的东西:

if [ -x "file" ]; then
 echo "file is executable"
else
 echo "file is not executable"

# will this if test work?
case $1
"--extract")
 if [ -e $2 ] && [ tar -tzf $2 >/dev/null ]; then
  echo "file exists and is tar archive"
 else
  echo "file either does not exists or it is not .tar arcive"
 fi
;;
esac

上面的代码不起作用,它被完全忽略了。有什么想法吗?

【问题讨论】:

标签: linux bash shell if-statement


【解决方案1】:

file命令可以判断文件类型:

file my.tar

如果是 tar 文件,它将输出:

my.tar: POSIX tar archive (GNU)

然后你可以使用grep来检查输出(是否包含tar压缩包):

file my.tar | grep -q 'tar archive; && echo "I'm tar" || echo "I'm not tar"

如果文件不存在,文件输出将是(退出代码为0):

do-not-exist.txt: cannot open `do-not-exist.txt' (No such file or directory).

您可以使用 case 语句来处理多种类型的文件。

【讨论】:

  • 感谢您的回答!但是,如果我使用 case $1 并且用户选择提取操作并将文件名作为参数传递,我可以只使用 $2 my.tar.gz。如果我需要检查一个文件是否存在并且是 tar 同时我可以写: if [ -x $2 ] && [ $2 my.tar.gz ];然后回显“文件存在,它是.tar”
  • 你应该展示file如何描述一个非压缩的tar文件。
  • 这个答案根本不涉及 tar 文件;它只是识别 Gzip 档案。
  • tar 文件的输出是 'my.tar: POSIX tar archive (GNU)' 而非现有文件的输出是 'do-not-exist.txt : 无法打开 `do-not-exist.txt' (没有这样的文件或目录)' 退出代码为 0。您可以使用 case 语句来处理几种情况
  • 刚刚更新了@chepner 建议的使用 .tar 文件而不是 .tar.gz 的答案
【解决方案2】:

我只想看看 tar 是否可以列出文件:

if ! { tar ztf "$file" || tar tf "$file"; } >/dev/null 2>&1; then
    echo "$file is not a tar file"
fi

【讨论】:

  • 我很确定 z 选项只会影响大多数现代 tar 实现中的 create 操作。列出 (-t) 或解压 (-x) 时,tar 将自动检测是否需要解压缩才能读取文件。 (FreeBSD 和 macOS 中的 GNU tar 和 bsdtar 至少是这种情况。)
【解决方案3】:

我通常根据file 命令使用这样的构造。

压缩包
$ file somefile1.tar.gz | grep -q 'gzip compressed data' && echo yes || echo no
yes

$ file somefile2.tar.gz | grep -q 'gzip compressed data' && echo yes || echo no
no
压缩包

以上处理 gzip 压缩的 tarball 文件,用于未压缩更改 grep 检测到的字符串:

$ file somefile1.tar | grep -q 'POSIX tar archive' && echo yes || echo no
yes

$ file somefile2.tar | grep -q 'POSIX tar archive' && echo yes || echo no
no

【讨论】:

    【解决方案4】:

    好的,我找到了答案。我知道这不是最理想的,但是,它可以按我的预期工作。

    我将来自用户的case $1 放入一个变量并创建另一个等于*.tar.gz 的变量然后在if 语句中我比较var1(来自用户输入的字符串)与var2 等于*tar.gz 并且它有效。

    【讨论】:

    • .tgz 也用于压缩 tar 文件
    猜你喜欢
    • 2015-11-17
    • 2012-04-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-11-06
    相关资源
    最近更新 更多