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

相关文章

在java中如何将inputStream对象转换为File对象(不生成本地文件)

《在java中如何将inputStream对象转换为File对象(不生成本地文件)》:本文主要介绍在java中如何将inputStream对象转换为File对象(不生成本地文件),具有很好的参考价... 目录需求说明问题解决总结需求说明在后端中通过POI生成Excel文件流,将输出流(outputStre

Spring定时任务只执行一次的原因分析与解决方案

《Spring定时任务只执行一次的原因分析与解决方案》在使用Spring的@Scheduled定时任务时,你是否遇到过任务只执行一次,后续不再触发的情况?这种情况可能由多种原因导致,如未启用调度、线程... 目录1. 问题背景2. Spring定时任务的基本用法3. 为什么定时任务只执行一次?3.1 未启用

Windows Server服务器上配置FileZilla后,FTP连接不上?

《WindowsServer服务器上配置FileZilla后,FTP连接不上?》WindowsServer服务器上配置FileZilla后,FTP连接错误和操作超时的问题,应该如何解决?首先,通过... 目录在Windohttp://www.chinasem.cnws防火墙开启的情况下,遇到的错误如下:无法与

Python解析器安装指南分享(Mac/Windows/Linux)

《Python解析器安装指南分享(Mac/Windows/Linux)》:本文主要介绍Python解析器安装指南(Mac/Windows/Linux),具有很好的参考价值,希望对大家有所帮助,如有... 目NMNkN录1js. 安装包下载1.1 python 下载官网2.核心安装方式3. MACOS 系统安

Windows系统下如何查找JDK的安装路径

《Windows系统下如何查找JDK的安装路径》:本文主要介绍Windows系统下如何查找JDK的安装路径,文中介绍了三种方法,分别是通过命令行检查、使用verbose选项查找jre目录、以及查看... 目录一、确认是否安装了JDK二、查找路径三、另外一种方式如果很久之前安装了JDK,或者在别人的电脑上,想

Java实现将byte[]转换为File对象

《Java实现将byte[]转换为File对象》这篇文章将通过一个简单的例子为大家演示Java如何实现byte[]转换为File对象,并将其上传到外部服务器,感兴趣的小伙伴可以跟随小编一起学习一下... 目录前言1. 问题背景2. 环境准备3. 实现步骤3.1 从 URL 获取图片字节数据3.2 将字节数组

Windows命令之tasklist命令用法详解(Windows查看进程)

《Windows命令之tasklist命令用法详解(Windows查看进程)》tasklist命令显示本地计算机或远程计算机上当前正在运行的进程列表,命令结合筛选器一起使用,可以按照我们的需求进行过滤... 目录命令帮助1、基本使用2、执行原理2.1、tasklist命令无法使用3、筛选器3.1、根据PID

Python中Windows和macOS文件路径格式不一致的解决方法

《Python中Windows和macOS文件路径格式不一致的解决方法》在Python中,Windows和macOS的文件路径字符串格式不一致主要体现在路径分隔符上,这种差异可能导致跨平台代码在处理文... 目录方法 1:使用 os.path 模块方法 2:使用 pathlib 模块(推荐)方法 3:统一使

Windows server服务器使用blat命令行发送邮件

《Windowsserver服务器使用blat命令行发送邮件》在linux平台的命令行下可以使用mail命令来发送邮件,windows平台没有内置的命令,但可以使用开源的blat,其官方主页为ht... 目录下载blatBAT命令行示例备注总结在linux平台的命令行下可以使用mail命令来发送邮件,Win

Windows环境下安装达梦数据库的完整步骤

《Windows环境下安装达梦数据库的完整步骤》达梦数据库的安装大致分为Windows和Linux版本,本文将以dm8企业版Windows_64位环境为例,为大家介绍一下达梦数据库的具体安装步骤吧... 目录环境介绍1 下载解压安装包2 根据安装手册安装2.1 选择语言 时区2.2 安装向导2.3 接受协议