【问题标题】:xargs oneliner to unzip filesxargs oneliner 解压缩文件
【发布时间】: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

你能帮我完成它吗?

谢谢!

【问题讨论】:

  • 当前命令到底有什么问题?另外,您能否提供一个&lt;getFolderName from {}&gt; 的示例以使其可重现?
  • 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,它应该打印它构建的命令。它们看起来正确吗?

标签: bash xargs


【解决方案1】:

$() 中的echo {} | sed 's/.*\///' 在执行任何其他操作之前、xargs 之前和定位之前执行。所以用 xargs 很难做到这一点。一种不使用 xargs 的方法:

locate -r [.]zip$ | \
   sed 's!.*/\([^/]*\)$!mkdir -p "\1"; unzip -n -d "\1" "&";!' | \
   sh 2> ERRORS

【讨论】:

  • 我不知道sed的这种用法,绝对聪明的解决方案!谢谢!
  • 这有效地使sed 充当更智能、更健壮的xargs
【解决方案2】:

使用 GNU Parallel 来提高可读性并可能加快速度:

locate -r [.]zip$ | parallel "mkdir -p {/.}; cd {/.} && unzip {}"

观看介绍视频以快速了解: https://www.youtube.com/playlist?list=PL284C9FF2488BC6D1

浏览教程(man parallel_tutorial)。你命令行 爱你。

【讨论】:

    猜你喜欢
    • 2015-07-09
    • 2010-09-05
    • 2013-03-09
    • 1970-01-01
    • 2010-12-14
    • 2011-01-23
    相关资源
    最近更新 更多