我目前正在努力解决以下问题:
在 macOS 中使用 bash shell,我想在我的下载目录中搜索名称中包含固定部分和可变部分的 zip 文件,固定部分是“satori-export”,然后解压缩该文件。作为一个完全的 *nix 新手,我想出了使用 CLI 来实现这一目标的方法(对于由于命令行的丑陋、低效或其他糟糕的使用而导致的任何流血的眼睛,提前表示歉意):
ls ~/Downloads | grep "satori-export" | sed 's/^/~\/Downloads\//' | xargs unzip
或者替代地
ls ~/Downloads | grep "satori-export" | sed 's/^/~\/Downloads\//' | xargs -I "archive" unzip "archive"
但是,运行这些命令中的任何一个都会得到以下输出:
unzip: cannot find or open ~/Downloads/satori-export-2517846752133086875-68d79887-0c61-43eb-a4ea-750a934a6121.zip, ~/Downloads/satori-export-2517846752133086875-68d79887-0c61-43eb-a4ea-750a934a6121.zip.zip or ~/Downloads/satori-export-2517846752133086875-68d79887-0c61-43eb-a4ea-750a934a6121.zip.ZIP.
奇怪的是,当我直接使用文件本身作为直接输入运行 unzip 命令时(如您所见,使用与上面解压缩失败消息中首先引用的文件名完全相同的路径和名称),使用
unzip ~/Downloads/satori-export-2517846752133086875-68d79887-0c61-43eb-a4ea-750a934a6121.zip
导致 unzip 继续解档文件,没有任何投诉或问题。所以我有点不明白为什么解压缩错误会出现在我的管道命令链中?
答案1
问题是它xargs
不能扩展~
;当您从命令行运行命令时,shell 会执行此操作,但这对您的管道没有帮助。因此,unzip
查找一个名为 的文件~/Downloads/satori-export-2517846752133086875-68d79887-0c61-43eb-a4ea-750a934a6121.zip
,或者错误消息中显示的变体之一,并且由于当前目录中没有指定的目录~
,更不用说包含 的目录Downloads/satori-export-2517846752133086875-68d79887-0c61-43eb-a4ea-750a934a6121.zip
,因此它会失败。
这应该有效:
find ~/Downloads -maxdepth 1 -name "*satori-export*" -exec unzip {} \;
这将找到~/Downloads
名称中包含 的所有文件satori-export
,并unzip
一次运行一个(这在这里很重要,因为unzip
仅将其参数中的第一个文件名作为要处理的存档的名称;其余的被解释为文件名在档案中查找)。