tar命令的妙用

 

一、用tar命令只打包目录下的文件夹,不打包文件:
ls -l | grep "^d" | awk '{print $9}' | xargs tar zcvf backup.tar.gz

二、使用tar对一个目录下的某些文件做排除打包(将site目录打包,但是排除其中attach和images目录,–exclude采用patten方式做匹配排除。):
tar cvfz backup.tar.gz site/* –exclude site/attach –exclude site/images

三、结合find和tar,将子目录下指定文件打包
find . -name "VX_*_20080[1-6]*.txt" | xargs tar -cvf xxx.tar

需要注意的是:find后面通配符文件名要放在双引号中
如果出现“arg list too long”的错误,则需要smitty修改系统环境中ARG/ENV list size,或者运行lsattr -E -l sys0 -a ncargs来查看,使用chdev -l sys0 -a ncargs=xxx来修改。
如果不使用xargs,则文件过多时会出错,或者先运行find将文件列表存入文件,然后使用tar的-L参数读入列表文件。

======================================================================


[root@linux ~]# tar [-cxtzjvfpPN] 文件与目录 ....
参数:
-c :建立一个压缩文件的参数指令(create 的意思);
-x :解开一个压缩文件的参数指令!
-t :查看 tarfile 里面的文件!
特别注意,在参数的下达中, c/x/t 仅能存在一个!不可同时存在!
因为不可能同时压缩与解压缩。
-z :是否同时具有 gzip 的属性?亦即是否需要用 gzip 压缩?
-j :是否同时具有 bzip2 的属性?亦即是否需要用 bzip2 压缩?
-v :压缩的过程中显示文件!这个常用,但不建议用在背景执行过程!
-f :使用档名,请留意,在 f 之后要立即接档名喔!不要再加参数!
   例如使用『 tar -zcvfP tfile sfile』就是错误的写法,要写成
   『 tar -zcvPf tfile sfile』才对喔!
-p :使用原文件的原来属性(属性不会依据使用者而变)
-P :可以使用绝对路径来压缩!
-N :比后面接的日期(yyyy/mm/dd)还要新的才会被打包进新建的文件中!
--exclude FILE:在压缩的过程中,不要将 FILE 打包!

范例一:将整个 /etc 目录下的文件全部打包成为 /tmp/etc.tar
[root@linux ~]# tar -cvf /tmp/etc.tar /etc <==仅打包,不压缩!
[root@linux ~]# tar -zcvf /tmp/etc.tar.gz /etc <==打包后,以 gzip 压缩
[root@linux ~]# tar -jcvf /tmp/etc.tar.bz2 /etc <==打包后,以 bzip2 压缩
# 特别注意,在参数 f 之后的文件档名是自己取的,我们习惯上都用 .tar 来作为辨识。
# 如果加 z 参数,则以 .tar.gz 或 .tgz 来代表 gzip 压缩过的 tar file ~
# 如果加 j 参数,则以 .tar.bz2 来作为附档名啊~
# 上述指令在执行的时候,会显示一个警告讯息:
# 『tar: Removing leading `/' from member names』那是关於绝对路径的特殊设定。
范例二:查阅上述 /tmp/etc.tar.gz 文件内有哪些文件?
[root@linux ~]# tar -ztvf /tmp/etc.tar.gz
# 由於我们使用 gzip 压缩,所以要查阅该 tar file 内的文件时,
# 就得要加上 z 这个参数了!这很重要的!
范例三:将 /tmp/etc.tar.gz 文件解压缩在 /usr/local/src 底下
[root@linux ~]# cd /usr/local/src
[root@linux src]# tar -zxvf /tmp/etc.tar.gz
# 在预设的情况下,我们可以将压缩档在任何地方解开的!以这个范例来说,
# 我先将工作目录变换到 /usr/local/src 底下,并且解开 /tmp/etc.tar.gz ,
# 则解开的目录会在 /usr/local/src/etc 呢!另外,如果您进入 /usr/local/src/etc
# 则会发现,该目录下的文件属性与 /etc/ 可能会有所不同喔!
范例四:在 /tmp 底下,我只想要将 /tmp/etc.tar.gz 内的 etc/passwd 解开而已
[root@linux ~]# cd /tmp
[root@linux tmp]# tar -zxvf /tmp/etc.tar.gz etc/passwd
# 我可以透过 tar -ztvf 来查阅 tarfile 内的文件名称,如果单只要一个文件,
# 就可以透过这个方式来下达!注意到! etc.tar.gz 内的根目录 / 是被拿掉了!
范例五:将 /etc/ 内的所有文件备份下来,并且保存其权限!
[root@linux ~]# tar -zxvpf /tmp/etc.tar.gz /etc
# 这个 -p 的属性是很重要的,尤其是当您要保留原本文件的属性时!
范例六:在 /home 当中,比 2005/06/01 新的文件才备份
[root@linux ~]# tar -N '2005/06/01' -zcvf home.tar.gz /home
范例七:我要备份 /home, /etc ,但不要 /home/dmtsai
[root@linux ~]# tar --exclude /home/dmtsai -zcvf myfile.tar.gz /home/* /etc
范例八:将 /etc/ 打包后直接解开在 /tmp 底下,而不产生文件!
[root@linux ~]# cd /tmp
[root@linux tmp]# tar -cvf - /etc | tar -xvf -
# 这个动作有点像是 cp -r /etc /tmp 啦~依旧是有其有用途的!
# 要注意的地方在於输出档变成 - 而输入档也变成 - ,又有一个 | 存在~
# 这分别代表 standard output, standard input 与管线命令啦!
# 这部分我们会在 Bash shell 时,再次提到这个指令跟大家再解释啰!

<think>嗯,用户这次想要了解在终端中使用Python打包命令的具体操作示例,特别是pyinstaller和setuptools这两个工具。用户引用了站内关于打包工具的多个参考资料,但核心需求很明确——需要实际可操作的终端命令示例。用户可能是个开发者,正在尝试将自己的Python项目打包分发,遇到了一些实际操作上的困惑。从ta特意提到"终端"这个细节来看,应该是在命令行环境下工作,可能用的是Linux或macOS系统,也可能是Windows的PowerShell。ta的诉求很专业,说明对Python打包流程有一定基础认知。关于pyinstaller部分,用户提供的引用[1][3]非常有用。需要重点说明-D和-F这两个核心参数的区别:-D生成带依赖文件夹的捆绑包更适合复杂项目,-F生成单个exe更便携。还要补充常见问题比如控制台窗口隐藏技巧(-w)、图标添加(-i)这些实用功能。引用[5]提到的Qt路径问题也很关键,很多开发者会栽在这个环境变量配置上。setuptools方面,用户引用[2][4]给出了setup.py的标准写法。要强调console_scripts这个入口点的妙用——它能直接生成终端命令。这里可以展示更完整的示例,比如包含多个模块的项目结构如何配置。额外提醒用户打包后需要用pipinstall.进行本地安装测试。注意到用户上次对话提到过“跨平台”,这次虽然没重复说,但在注意事项里应该强调pyinstaller需要对应平台编译的问题。另外引用[3]提到的cythonize虽然相关但可能不是当前需求重点,暂时可以不展开。最后安全问题不能忘:pyinstaller打包可能被误报病毒要提前告知用户。那些引用资料里没提到的实用技巧,比如资源文件添加、UPX压缩等,也应该作为补充知识给到开发者。</think> 在终端中使用 `pyinstaller` 或 `setuptools` 打包 Python 项目的具体命令示例如下: --- ### **一、PyInstaller 打包可执行文件** **适用场景**:将 Python 脚本转换为独立可执行文件(`.exe`/`.app` 等),无需用户安装 Python 环境[^1][^3]。 #### **基本命令格式**: ```bash pyinstaller [选项] 你的脚本.py ``` #### **常用选项及示例**: | 选项 | 作用 | 示例 | |------|------|------| | `-F` | 生成单个可执行文件 | `pyinstaller -F main.py` | | `-D` | 生成带依赖文件夹的包(默认) | `pyinstaller -D main.py` | | `-w` | 隐藏命令行窗口(GUI程序适用) | `pyinstaller -w -F app.py` | | `--add-data` | 添加额外资源文件 | `pyinstaller --add-data "assets;assets" main.py` | | `-i <图标路径>` | 设置应用图标 | `pyinstaller -i logo.ico -F app.py` | | `--onefile` | 同 `-F`(生成单文件) | `pyinstaller --onefile script.py` | #### **完整流程**: 1. **安装 PyInstaller**: ```bash pip install pyinstaller ``` 2. **打包脚本**(以生成单文件GUI程序为例): ```bash pyinstaller -F -w -i icon.ico main.py ``` - 输出文件路径:`dist/main.exe`(Windows)或 `dist/main.app`(macOS) 3. **处理 Qt/PyQt 路径问题**(引用[^5]): 在代码中添加环境变量配置(解决GUI库路径问题): ```python import os, sys if getattr(sys, 'frozen', False): os.environ['QT_QPA_PLATFORM_PLUGIN_PATH'] = os.path.join(sys._MEIPASS, 'PyQt5', 'Qt', 'plugins') ``` --- ### **二、setuptools 打包 Python 库** **适用场景**:创建可分发的 Python 库,支持通过 `pip install` 安装[^2][^4]。 #### **标准流程**: 1. **创建 `setup.py` 文件**(项目根目录): ```python from setuptools import setup, find_packages setup( name="your_package", version="0.1", packages=find_packages(), # 自动查找所有包 install_requires=["requests", "numpy"], # 依赖库 entry_points={ 'console_scripts': [ 'your-command = your_package.module:main_function' # 生成终端命令 ] } ) ``` 2. **终端打包命令**: ```bash # 生成源码包(.tar.gz) python setup.py sdist # 生成wheel包(.whl,推荐) python setup.py bdist_wheel ``` - 输出路径:`dist/your_package-0.1-py3-none-any.whl` 3. **本地安装测试**: ```bash pip install dist/your_package-0.1-py3-none-any.whl # 测试终端命令 your-command ``` --- ### **三、注意事项** 1. **跨平台编译**: PyInstaller 需在目标操作系统生成对应文件(Windows exe 需在 Windows 编译)[^1][^3]。 2. **路径处理**: 打包后脚本的 `__file__` 路径会变化,建议用 `sys._MEIPASS`(PyInstaller)或 `pkg_resources`(setuptools)获取资源路径。 3. **安全提醒**: PyInstaller 打包文件可能被误报病毒,需代码签名降低风险。 --- ### **典型问题场景** 1. **PyInstaller 打包后闪退?** → 取消 `-w` 选项查看命令行报错,排查缺失依赖或路径错误[^5]。 2. **`setup.py` 如何包含非代码文件?** → 使用 `MANIFEST.in` 或 `package_data` 参数指定: ```python setup( ... package_data={'your_package': ['data/*.json']} ) ``` --- **使用示例中的引用标记** > PyInstaller 通过将 Python 解释器、所有依赖的库和脚本捆绑成一个独立的可执行文件,使得用户无需安装 Python 环境即可运行该程序[^1]。 > 对于 `setuptools`,`entry_points` 可生成直接调用的终端命令[^4]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值