Chris Marasti-Georg Asked: 2009-05-01 06:04:03 +0800 CST2009-05-01 06:04:03 +0800 CST 2009-05-01 06:04:03 +0800 CST 如何在不浪费 HD 空间的情况下使用 cygwin?[关闭] 772 我喜欢使用Cygwin,但我讨厌它似乎使用了我不需要的缓存东西的所有额外磁盘空间。我可以删除什么以使我的安装占用空间尽可能小? 在相关的说明中,什么是一套好的准系统包,可以为我提供必需品,没有我可能永远不会运行的绒毛? cygwin 9 个回答 Voted Dan 2009-06-08T22:47:07+08:002009-06-08T22:47:07+08:00 有些人似乎认为在这个人使用的任何平台上更换硬件都很容易。如果他们可能使用 CF 适配器和 4GB 卡在上网本或类似设备上运行 Windows,那么 500MB 实际上可能是要牺牲的大量空间。或者他们可能正在将其安装到虚拟映像中,而这些额外信息意味着它在安装在解压缩的 DVD 上或必须跨越多个 DVD 与处理随之而来的问题之间的区别,特别是如果它被发送给客户例如,不是特别技术性;针对贵公司开发的应用程序的内部培训材料。为所有受训者提供一个相同的定义图像可以创造奇迹,使环境同质化,并使培训师的生活更轻松。 解决用户提出的问题或向他们提问以获取更多信息。 潜在的解决方案: 安装 Cygwin 时,在屏幕上询问您将软件包存储在哪里,将其指向特定位置,例如 c:\Cygwin\Packages。正常安装,运行它以检查它是否正常运行。删除存储包的文件夹,如果需要更新,Cygwin 将再次下载它,这不是最有效地使用带宽,但根据您的要求,它可能比在本地保存缓存更好。 另一种选择是安装这些软件包,但第一次安装时,请将软件包保存到另一个位置,例如 USB 驱动器,然后如果你必须这样做 Brian De Smet 2009-06-09T15:47:19+08:002009-06-09T15:47:19+08:00 我注意到我当前的安装小于 250MB,在我开始在我的笔记本电脑上关心它之前,它必须是这个大小的四倍。 但是,如果你需要让它变小... 下载安装程序。将其保存到 c:\cygwin\setup.exe。运行安装程序。尽可能多地取消选择包。请注意,如果您选择有要求的包,它将自动选择所需的包。删除安装程序缓存(应该默认为 c:\cygwin(http|ftp)something oranother。从 c:\setup.exe 重新运行安装程序,尝试卸载更多包。重复直到安装程序尽可能小。 请注意,即使是最小的安装,也会需要一堆基本的库包。我过去(大约一年前)将它降低到 100 兆以下,同时仍然拥有我曾经在 bash 脚本方面投入的所有东西。 Sam Merrell 2009-05-01T07:11:36+08:002009-05-01T07:11:36+08:00 如果不安装 Cygwin,我就无法使用 Windows,但我从来没有真正遇到过使用磁盘空间的问题。我认为您可以删除 Cygwin 存储软件包的文件夹,但每次更新 Cygwin 时,它都会下载所需的软件包。 至于准系统设置,它真的取决于你需要什么。我从基本的 Cygwin 安装开始,然后添加 OpenSSH、Cron、RXVT、Screen、Vim、Git、Curl、Zip/Unzip 和 Wget。这些是我需要的大部分工具,但如果需要,我只是安装其他东西。 Brian De Smet 2009-06-09T15:54:13+08:002009-06-09T15:54:13+08:00 除了 Cygwin,您还可以使用更多不打算解决 Cygwin 旨在解决的所有问题的软件包。有一些 unix 实用程序包,其中只有最常用的程序的有限选择。 Unix Utilties for Windows是我以前使用的那个,但它似乎是一个死项目。 GnuWin32似乎还活着。 brianegge 2009-07-08T19:56:14+08:002009-07-08T19:56:14+08:00 我将从基本的 cygwin 包开始,并在您需要的任何其他命令中使用“page-fault”。我保留了我使用的常用实用程序的列表,但可能与您使用的完全不同。安装 Cygwin 时不要选择所有包。我这样做过一次,大约需要 6GB。我的想法是,我永远不必担心没有程序。这是个坏主意。 我的 Windows XP 机器有 1.1 GB 的服务包卸载数据。在尝试修剪 Cygwin 之前,我会删除这些文件。尝试使用WinDirStat程序并查看所有硬盘空间的去向 - 它可能不是 Cygwin。此外,有时您可能应该删除 C:\cygwin\tmp,因为重新启动时不会清除它。 Arialdo Martini 2012-04-21T03:03:08+08:002012-04-21T03:03:08+08:00 您可以从 CygWin 切换到Gow,这是 CygWin 的轻量级替代品(大约轻 10 倍) Lou Fiorino 2015-01-30T11:34:48+08:002015-01-30T11:34:48+08:00 如果您多次提取设置文件,您会看到未使用的文件被留下... 要清理 Cygwin 安装集(不是已安装的代码库,而是用于执行安装的包... 我想我在某处看到了一个 perl 脚本来执行此操作,但请尝试使用此 java 代码来清理 Cygwin 设置: import java.io.BufferedReader; import java.io.File; import java.io.FileInputStream; import java.io.InputStreamReader; import java.text.DecimalFormat; import java.util.HashSet; public class CygwinCleaner { boolean doClean = false; long diskFileCount = -1; long setupFileCount = 0; long missingFileCount = 0; long srcFileCount = 0; long deleteCount = 0; public HashSet<String> pkgs = new HashSet<String>(9999); public String formatCount(long count) { DecimalFormat df = new DecimalFormat("##,###"); String retval = " " + df.format(count); return retval.substring(retval.length() - 6); } public void checkForMissingFiles() { for (String filename : this.pkgs) { if (!filename.contains("-src.")) { if (!((new File(filename)).exists())) { System.err.println(" Missing " + filename); missingFileCount++; } } } } public void checkOrCleanFiles(File testfile) { String tfap = null; if (testfile.isDirectory()) { for (File file : testfile.listFiles()) { checkOrCleanFiles(file); } } else { this.diskFileCount++; tfap = testfile.getAbsolutePath(); if (!this.pkgs.contains(tfap)) { if (this.doClean) { System.err.println("Deleting \"" + tfap + "\""); if (testfile.delete()) { this.deleteCount++; } else { System.err.println("COULD NOT DELETE \"" + tfap + "\""); } } else { System.err.println("WOULD delete \"" + tfap + "\""); } } } } public boolean loadFileList(File file) { boolean retval = false; if (file.exists()) { try { String basedir = (new File(file.getParent())).getParent() + "/"; basedir = basedir.replace('\\', '/'); BufferedReader br = null; br = new BufferedReader(new InputStreamReader(new FileInputStream(file))); String line = br.readLine(); String installFile = null; boolean processlines = false; while ((line = br.readLine()) != null) { if (processlines) { if (line.startsWith("install:") || line.startsWith("source:")) { installFile = line.substring(1 + line.indexOf(" ")); installFile = installFile.substring(0, installFile.indexOf(" ")); installFile = basedir + installFile; String hashString = (new File(installFile)).getAbsolutePath(); if (!this.pkgs.contains(hashString)) { this.pkgs.add(hashString); this.setupFileCount++; if (line.startsWith("source:")) { srcFileCount++; } } } } if (line.startsWith("@ ")) { processlines = true; } if (line.startsWith("[test]") || line.startsWith("[prev]")) { processlines = false; } } br.close(); retval = true; } catch (Throwable t) { t.printStackTrace(); } } return retval; } public static void main(String[] args) { if (args.length == 0) { System.err.println("Usage::::: CygwinCleaner {full_path_to_setup.ini} [CLEAN]\nIf only the ini file is specified then a report will be generated\nTo perform the cleanup add the second optional parameter of CLEAN"); } else { System.out.print("CygwinCleaner: "); CygwinCleaner cc = new CygwinCleaner(); String setupFileName = args[0]; if (args.length > 1) { if (args[1].equalsIgnoreCase("CLEAN")) cc.doClean = true; } if (cc.doClean) { System.out.println("Performing cleanup\n"); } else { System.out.println("Reporting only\n"); } File file = new File(setupFileName); cc.pkgs.add(file.getAbsolutePath()); if (cc.loadFileList(file)) { cc.checkOrCleanFiles(file.getParentFile()); cc.checkForMissingFiles(); System.out.println(" Total of:" + cc.formatCount(cc.setupFileCount) + " files in setup.ini"); System.out.println(" Source:" + cc.formatCount(cc.srcFileCount) + " files in setup.ini"); System.out.println(" Leaving:" + cc.formatCount((cc.setupFileCount - cc.srcFileCount)) + " files in setup.ini\n"); System.out.println(" Total of:" + cc.formatCount(cc.diskFileCount) + " files in setup directory before cleanup"); System.out.println(" Deleted:" + cc.formatCount(cc.deleteCount) + " files in setup directory (unused)"); System.out.println(" Leaving:" + cc.formatCount((cc.diskFileCount-cc.deleteCount)) + " files in setup directory after cleanup\n"); System.out.println(" Missing:" + cc.formatCount(cc.missingFileCount) + " files in setup directory that are contained in setup.ini"); } else { System.err.println("setup.ini file (" + setupFileName + ") does nofiles in setup"); } } } } Agnatha 2016-12-24T11:53:35+08:002016-12-24T11:53:35+08:00 我一直在尝试 Cygwin,试图获得一个“简单的”,最小的安装。我确实发现安装 grep、gawk、sed 和类似工具等实用程序对 cygwin、base-Cygwin 以及有时不需要的工具(如 bash、coreutils 等)有依赖关系,我还没有尝试完全理解为什么存在这种依赖关系,但这不是我的目标。我只想安装工具及其所需的 dll 并开始检查 Cygwin 包。我发现不使用 Cygwin 提供的 setup.exe 是完成最小 Cygwin 安装的另一种方法。这就是我完成它的方式。 使用 Cygwin 提供的 setup.exe 下载所有软件包 - 仅下载而不安装。 成功完成下载后,会在 x86/release 或 x86_64/release 目录下找到 zlib、gawk、grep、libiconv 等单个软件包。 每个包都是'tar'red 并使用工具'xz' 或bzip 压缩并存储在各自的目录中。 要安装 sed 或 gawk 等特定工具,只需提取工具可执行文件及其依赖项 (.dll) 在您尝试以下操作之前,请确保您拥有 7z.exe、xz.exe、bzip2 或其他能够解压缩 .xz 或 bzip 存档的工具 安装 gawk 示例如下: 使用以下命令从 gawk-4.1.3-1.tar.xz 存档中提取 gawk.exe - 7z.exe e -so gawk-4.1.3-1.tar.xz | 焦油 xvf - 完成后,您通常应该在子文件夹中找到 gawk.exe,即 release/gawk 文件夹下的 usr/bin 查找 gawk 的依赖项 - 您可以通过多种方式执行此操作。 检查在 x86 或 x86_64 文件夹中找到的 Cygwin setup.ini 文件。查找字符串 '@gawk' 并在此行之后的行中找到列出依赖项的“requires:”行。 我的读法是这样的-“需要:bash cygwin libgmp10 libintl8 libmpfr4 libreadline7” 要运行 gawk,bash 不是必须的,因为我们有 windows 命令 shell。(包含 bash 以获取 gawk 所需的其他一些 dll。但是,这会导致安装更多不必要的文件)。其他依赖项包含 gawk 需要运行的文件。使用 7z 或 xz 等工具将上述每个包提取到单独的文件中。 提取所有依赖项后,将所需的工具(grep/sed/gawk)复制到一个文件夹和所有依赖的 .dll 中,您现在应该能够使用所需的最少 .dll 集来运行您的工具。 -bones cygwin 安装。 注意:仅提取 setup.ini 中列出的每个工具的依赖项可能还不够。有时,您可能需要执行/运行该工具以发现需要更多 dll。 还有其他方法可以找出 exe 所需的 dll - 您可以使用 MS 中的 dumpbin 或 dependency walker、ndepends 或类似工具来查找依赖 dll 的列表 咨询 - https://stackoverflow.com/questions/362560/how-do-i-detect-the-dlls-required-by-an-application https://stackoverflow.com/questions/475148/how-do-i -找出-哪个-dll-一个-可执行文件-将加载 我还通过仅运行该工具并通过从所需的包中提取来一一安装缺少的 dll 来强制依赖 dll 信息。 当您运行 exe 时,如果它因缺少 .dll 消息而出错,请在此处搜索包含该 dll 的包 - https://cygwin.com/cgi-bin2/package-grep.cgi。输入缺少的 dll 的全名/部分名称以查找包含该 dll 的包的名称。 最终,我完成了一个简单的 cygwin 安装,只安装了我需要的工具和 dll。示例:gawk - gawk.exe 和以下 dll - cygwin1.dll、cyggmp-10.dll、cygiconv-2.dll、cygintl-8.dll、cygmpfr-4.dll、cyggcc_s-seh-1.dll、cygncursesw- 10.dll、cygreadline7.dll sed - sed.exe 和 dll - cygwin1.dll、cygintl-8.dll 希望这是有用的。Cywin 安装程序也做了 dll re-basing,我不会在这里冒险 netlinxman 2009-06-08T19:53:05+08:002009-06-08T19:53:05+08:00 作为 cygwin 用户,我同意前面的两个帖子。 需要:grep、sed、awk、cut、diff、comm、vim、OpenSSH、tar、gzip、bash、wget 至于空间,我同意伊恩的观点。为空间付出的小代价。您现在可以以低于 100.00 美元的价格购买 1TB 10,000 RPM 驱动器。我记得我们都必须为 20.00 GB 驱动器支付超过 150.00 美元。 如果您真的关心本地驱动器空间,请尝试让自己的 NAS 存储盒坐在您的网络上,并将“下载的包”存储到其中。这将进一步减少您自己机器上的占用空间。 为 Cygwin 付出的代价真的很小。
有些人似乎认为在这个人使用的任何平台上更换硬件都很容易。如果他们可能使用 CF 适配器和 4GB 卡在上网本或类似设备上运行 Windows,那么 500MB 实际上可能是要牺牲的大量空间。或者他们可能正在将其安装到虚拟映像中,而这些额外信息意味着它在安装在解压缩的 DVD 上或必须跨越多个 DVD 与处理随之而来的问题之间的区别,特别是如果它被发送给客户例如,不是特别技术性;针对贵公司开发的应用程序的内部培训材料。为所有受训者提供一个相同的定义图像可以创造奇迹,使环境同质化,并使培训师的生活更轻松。
解决用户提出的问题或向他们提问以获取更多信息。
潜在的解决方案:
安装 Cygwin 时,在屏幕上询问您将软件包存储在哪里,将其指向特定位置,例如 c:\Cygwin\Packages。正常安装,运行它以检查它是否正常运行。删除存储包的文件夹,如果需要更新,Cygwin 将再次下载它,这不是最有效地使用带宽,但根据您的要求,它可能比在本地保存缓存更好。
另一种选择是安装这些软件包,但第一次安装时,请将软件包保存到另一个位置,例如 USB 驱动器,然后如果你必须这样做
我注意到我当前的安装小于 250MB,在我开始在我的笔记本电脑上关心它之前,它必须是这个大小的四倍。
但是,如果你需要让它变小...
下载安装程序。将其保存到 c:\cygwin\setup.exe。运行安装程序。尽可能多地取消选择包。请注意,如果您选择有要求的包,它将自动选择所需的包。删除安装程序缓存(应该默认为 c:\cygwin(http|ftp)something oranother。从 c:\setup.exe 重新运行安装程序,尝试卸载更多包。重复直到安装程序尽可能小。
请注意,即使是最小的安装,也会需要一堆基本的库包。我过去(大约一年前)将它降低到 100 兆以下,同时仍然拥有我曾经在 bash 脚本方面投入的所有东西。
如果不安装 Cygwin,我就无法使用 Windows,但我从来没有真正遇到过使用磁盘空间的问题。我认为您可以删除 Cygwin 存储软件包的文件夹,但每次更新 Cygwin 时,它都会下载所需的软件包。
至于准系统设置,它真的取决于你需要什么。我从基本的 Cygwin 安装开始,然后添加 OpenSSH、Cron、RXVT、Screen、Vim、Git、Curl、Zip/Unzip 和 Wget。这些是我需要的大部分工具,但如果需要,我只是安装其他东西。
除了 Cygwin,您还可以使用更多不打算解决 Cygwin 旨在解决的所有问题的软件包。有一些 unix 实用程序包,其中只有最常用的程序的有限选择。
Unix Utilties for Windows是我以前使用的那个,但它似乎是一个死项目。
GnuWin32似乎还活着。
我将从基本的 cygwin 包开始,并在您需要的任何其他命令中使用“page-fault”。我保留了我使用的常用实用程序的列表,但可能与您使用的完全不同。安装 Cygwin 时不要选择所有包。我这样做过一次,大约需要 6GB。我的想法是,我永远不必担心没有程序。这是个坏主意。
我的 Windows XP 机器有 1.1 GB 的服务包卸载数据。在尝试修剪 Cygwin 之前,我会删除这些文件。尝试使用WinDirStat程序并查看所有硬盘空间的去向 - 它可能不是 Cygwin。此外,有时您可能应该删除 C:\cygwin\tmp,因为重新启动时不会清除它。
您可以从 CygWin 切换到Gow,这是 CygWin 的轻量级替代品(大约轻 10 倍)
如果您多次提取设置文件,您会看到未使用的文件被留下...
要清理 Cygwin 安装集(不是已安装的代码库,而是用于执行安装的包...
我想我在某处看到了一个 perl 脚本来执行此操作,但请尝试使用此 java 代码来清理 Cygwin 设置:
我一直在尝试 Cygwin,试图获得一个“简单的”,最小的安装。我确实发现安装 grep、gawk、sed 和类似工具等实用程序对 cygwin、base-Cygwin 以及有时不需要的工具(如 bash、coreutils 等)有依赖关系,我还没有尝试完全理解为什么存在这种依赖关系,但这不是我的目标。我只想安装工具及其所需的 dll 并开始检查 Cygwin 包。我发现不使用 Cygwin 提供的 setup.exe 是完成最小 Cygwin 安装的另一种方法。这就是我完成它的方式。
要安装 sed 或 gawk 等特定工具,只需提取工具可执行文件及其依赖项 (.dll)
在您尝试以下操作之前,请确保您拥有 7z.exe、xz.exe、bzip2 或其他能够解压缩 .xz 或 bzip 存档的工具
安装 gawk 示例如下:
要运行 gawk,bash 不是必须的,因为我们有 windows 命令 shell。(包含 bash 以获取 gawk 所需的其他一些 dll。但是,这会导致安装更多不必要的文件)。其他依赖项包含 gawk 需要运行的文件。使用 7z 或 xz 等工具将上述每个包提取到单独的文件中。
提取所有依赖项后,将所需的工具(grep/sed/gawk)复制到一个文件夹和所有依赖的 .dll 中,您现在应该能够使用所需的最少 .dll 集来运行您的工具。 -bones cygwin 安装。
还有其他方法可以找出 exe 所需的 dll - 您可以使用 MS 中的 dumpbin 或 dependency walker、ndepends 或类似工具来查找依赖 dll 的列表
咨询 - https://stackoverflow.com/questions/362560/how-do-i-detect-the-dlls-required-by-an-application https://stackoverflow.com/questions/475148/how-do-i -找出-哪个-dll-一个-可执行文件-将加载
我还通过仅运行该工具并通过从所需的包中提取来一一安装缺少的 dll 来强制依赖 dll 信息。
当您运行 exe 时,如果它因缺少 .dll 消息而出错,请在此处搜索包含该 dll 的包 - https://cygwin.com/cgi-bin2/package-grep.cgi。输入缺少的 dll 的全名/部分名称以查找包含该 dll 的包的名称。
最终,我完成了一个简单的 cygwin 安装,只安装了我需要的工具和 dll。示例:gawk - gawk.exe 和以下 dll - cygwin1.dll、cyggmp-10.dll、cygiconv-2.dll、cygintl-8.dll、cygmpfr-4.dll、cyggcc_s-seh-1.dll、cygncursesw- 10.dll、cygreadline7.dll
sed - sed.exe 和 dll - cygwin1.dll、cygintl-8.dll
希望这是有用的。Cywin 安装程序也做了 dll re-basing,我不会在这里冒险
作为 cygwin 用户,我同意前面的两个帖子。
需要:grep、sed、awk、cut、diff、comm、vim、OpenSSH、tar、gzip、bash、wget
至于空间,我同意伊恩的观点。为空间付出的小代价。您现在可以以低于 100.00 美元的价格购买 1TB 10,000 RPM 驱动器。我记得我们都必须为 20.00 GB 驱动器支付超过 150.00 美元。
如果您真的关心本地驱动器空间,请尝试让自己的 NAS 存储盒坐在您的网络上,并将“下载的包”存储到其中。这将进一步减少您自己机器上的占用空间。
为 Cygwin 付出的代价真的很小。