【发布时间】:2014-01-15 10:36:22
【问题描述】:
从 bash 命令行,我必须在我的系统中找到名称与特定模式匹配的所有 zip 文件,然后将它们解压缩到我的目录中。
我想在子文件夹中组织解压缩文件,并且我想根据原始 zip 文件名称(不使用完整路径)选择具有自定义命名约定的子文件夹名称。
我知道 for 循环是有效的,因为我现在正在学习 xargs,我想知道我是否可以在 xargs oneliner 中做同样的事情;类似于:
locate -r "<zipped files regex>" | xargs -i -t "foldername=$(echo {} | sed 's/.*\///'); mkdir -p $folderName; unzip {} -d $folderName"
我收到这条消息:
foldername={}; mkdir -p ; unzip {} -d
xargs: foldername={}; mkdir -p ; unzip {} -d : No such file or directory
你能帮我完成它吗?
谢谢!
【问题讨论】:
-
当前命令到底有什么问题?另外,您能否提供一个
<getFolderName from {}>的示例以使其可重现? -
Xargs 将所有内容传递给一个 zip 命令,而 zip 一次只能处理一个 zip 文件,因此您应该使用 for 循环或
find ... -exec。 -
@SamiLaine 好点,但
xargs有一个-n(--max-args) 选项。尽管如此,将find与-exec一起使用更简单。 -
@Lev:例如
locate -r ".*libs_j.*jar$" | xargs -i -t "foldername=$(echo {} | sed 's/.*\///'); mkdir -p folderName; unzip {} -d $folderName" -
@FrancescoS。您可以edit该问题以添加更多信息。此外,提供错误消息或“不工作”的其他详细信息总是有帮助的。你有
-t,它应该打印它构建的命令。它们看起来正确吗?