Windows下执行`tar -xvf file.tar.bz2`解压bzip2文件

2024-02-01 03:28

本文主要是介绍Windows下执行`tar -xvf file.tar.bz2`解压bzip2文件,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

目标,在Rust程序里解压.tar.bz2压缩包。

折腾了大半天,走了很多弯路。一是经验不足,没有及时想到合适的Shell,二是我的应用场景是在Windows系统下调用Linux命令行,难度较大。

一开始就想到std::process::Command,要执行的是一个SHELL进程,参数有两个,参数1是"/C"或"-c",参数2是命令行。此信息Command的docs里有明示,还有例子。只是我此前理解不深入,把tar当作进程、把-xvf等当作tar的参数,一开始起点就偏了。把tar当进程勉强还行(Windows10系统目录里有tar.exe),可要解压的是.tar.bz2文件,tar还得另外调用bzip2进程,后面直接就报莫名其妙的错误。后来我把Git安装目录里的usr/bin/sh.exe当作SHELL做了很多尝试都失败了(其实距离git-bash.exe仅有一步之遥,偏偏当时想不到),最大的问题是它大概率会在解压过程中卡死,成功率极低,原因不明。

在用Command没搞定的情况下,我又尝试了多种其它方法:

  • 使用tar库能解压.tar不能解压.tar.bz2文件;
  • 使用zip库解压.tar.bz2文件时报文件头错误;
  • 使用bzip2库只能处理数据流不涉及文件操作;
  • 用7z.exe解压它先解出.tar不能一步到位。

最后又回到Command执行SHELL的路子,引入git-bash.exe才最终搞定。

  • 总结1:Linux SHELL的参数1为"-c"时(Windows的cmd.exe为"/C"时),参数2被当作命令行直接执行;否则参数1被当作脚本文件执行。如果你要执行的既不是命令行也不是脚本文件,那直接执行就好了,不需要作为SHELL的参数。也就是说Command有三种执行模式:1执行SHELL命令行(“-c”);2执行SHELL脚本文件(.sh/.bat);3执行普通exe(有自己的参数)。
  • 总结2:在Windows系统里调用Linux命令行,可用Git安装目录里的git-bash.exe当作SHELL,参数1为"-c",参数2为命令行tar -xvf file.tar.bz2,即上述执行模式1,实验证实可行。其实我两年前用过git-bash.exe,在任务计划(taskmgr)里调用它执行.sh脚本(无"-c"参数,即执行模式2)。其实git-bash.exe加上"-c"参数就可用执行Linux命令行(执行模式1),只是我一开始没想到,后来才恍然大悟。
  • 总结3:使用std::env::set_current_dir()设置当前路径可大幅简化tar命令行。否则要在tar命令行里指定输入输出目录的话,还得手工拼接字符串(不能用Command.arg()),还要考虑Windows和Linux路径的不同(git-bash.exe使用精简版msys64,C:\Windows在其中表示为/c/Windows)。
  • 总结4:遇到命令行参数错误,黑窗口又一闪而过根本看不清错误反馈时,可用在命令行末尾加上 || sleep 6,延时几秒钟很有用(仅前面命令失败了才延时)。

缺点和不足:通过Command调用SHELL执行命令行或脚本,Command.output()返回的是SHELL本身的执行结果,而非SHELL内部命令或脚本的执行结果。即使内部命令或脚本执行错误,SHELL自身执行依然是成功的。此外我们也拿不到它内部输出的stdin/stdio文本,不方便排查问题。调用SHELL命令行解压,如果可预测解压后的文件,可通过文件是否存在判断是否解压成功,否则不好判断。

这篇关于Windows下执行`tar -xvf file.tar.bz2`解压bzip2文件的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/665944

相关文章

CentOS7安装配置mysql5.7 tar免安装版

一、CentOS7.4系统自带mariadb # 查看系统自带的Mariadb[root@localhost~]# rpm -qa|grep mariadbmariadb-libs-5.5.44-2.el7.centos.x86_64# 卸载系统自带的Mariadb[root@localhost ~]# rpm -e --nodeps mariadb-libs-5.5.44-2.el7

maven 编译构建可以执行的jar包

💝💝💝欢迎莅临我的博客,很高兴能够在这里和您见面!希望您在这里可以感受到一份轻松愉快的氛围,不仅可以获得有趣的内容和知识,也可以畅所欲言、分享您的想法和见解。 推荐:「stormsha的主页」👈,「stormsha的知识库」👈持续学习,不断总结,共同进步,为了踏实,做好当下事儿~ 专栏导航 Python系列: Python面试题合集,剑指大厂Git系列: Git操作技巧GO

在 Windows 上部署 gitblit

在 Windows 上部署 gitblit 在 Windows 上部署 gitblit 缘起gitblit 是什么安装JDK部署 gitblit 下载 gitblit 并解压配置登录注册为 windows 服务 修改 installService.cmd 文件运行 installService.cmd运行 gitblitw.exe查看 services.msc 缘起

Windows如何添加右键新建菜单

Windows如何添加右键新建菜单 文章目录 Windows如何添加右键新建菜单实验环境缘起以新建`.md`文件为例第一步第二步第三步 总结 实验环境 Windows7 缘起 因为我习惯用 Markdown 格式写文本,每次新建一个.txt后都要手动修改为.md,真的麻烦。如何在右键新建菜单中添加.md选项呢? 网上有很多方法,这些方法我都尝试了,要么太麻烦,要么不凑效

jenkins 插件执行shell命令时,提示“Command not found”处理方法

首先提示找不到“Command not found,可能我们第一反应是查看目标机器是否已支持该命令,不过如果相信能找到这里来的朋友估计遇到的跟我一样,其实目标机器是没有问题的通过一些远程工具执行shell命令是可以执行。奇怪的就是通过jenkinsSSH插件无法执行,经一番折腾各种搜索发现是jenkins没有加载/etc/profile导致。 【解决办法】: 需要在jenkins调用shell脚

Windows下Nginx的安装及开机启动

1、将nginx-1.16.1.zip解压拷贝至D:\web\nginx目录下。 2、启动Nginx,两种方法: (1)直接双击nginx.exe,双击后一个黑色的弹窗一闪而过。 (2)打开cmd命令窗口,切换到nginx目录下,输入命令 nginx.exe 或者 start nginx ,回车即可。 3、检查nginx是否启动成功。 直接在浏览器地址栏输入网址 http://lo

Lua 脚本在 Redis 中执行时的原子性以及与redis的事务的区别

在 Redis 中,Lua 脚本具有原子性是因为 Redis 保证在执行脚本时,脚本中的所有操作都会被当作一个不可分割的整体。具体来说,Redis 使用单线程的执行模型来处理命令,因此当 Lua 脚本在 Redis 中执行时,不会有其他命令打断脚本的执行过程。脚本中的所有操作都将连续执行,直到脚本执行完成后,Redis 才会继续处理其他客户端的请求。 Lua 脚本在 Redis 中原子性的原因

Windows环境利用VS2022编译 libvpx 源码教程

libvpx libvpx 是一个开源的视频编码库,由 WebM 项目开发和维护,专门用于 VP8 和 VP9 视频编码格式的编解码处理。它支持高质量的视频压缩,广泛应用于视频会议、在线教育、视频直播服务等多种场景中。libvpx 的特点包括跨平台兼容性、硬件加速支持以及灵活的接口设计,使其可以轻松集成到各种应用程序中。 libvpx 的安装和配置过程相对简单,用户可以从官方网站下载源代码

Smarty模板执行原理

为了实现程序的业务逻辑和内容表现页面的分离从而提高开发速度,php 引入了模板引擎的概念,php 模板引擎里面最流行的可以说是smarty了,smarty因其功能强大而且速度快而被广大php web开发者所认可。本文将记录一下smarty模板引擎的工作执行原理,算是加深一下理解。 其实所有的模板引擎的工作原理是差不多的,无非就是在php程序里面用正则匹配将模板里面的标签替换为php代码从而将两者

Python脚本:批量解压RAR文件

所需模块: os.getcwd() #获取脚本文件路径os.system() #执行系统命令 import os#source_dir = input("Please input in source_dir:")#unzip_dir = input("Please input in unzip_dir:") source_dir = os.