【问题标题】:Copy all files with certain extension to another directory, while changing the extension将具有特定扩展名的所有文件复制到另一个目录,同时更改扩展名
【发布时间】:2015-06-12 01:42:48
【问题描述】:

我想将所有扩展名为aaa 的文件从目录a 复制到目录b,将扩展名替换为bbb。我试图做这样的事情:

ls a | grep \.bla$ | cut --delimiter=. -f 1 | xargs cp a/{}.aaa b/{}.bbb

但它真的关闭了。我想要一个 oneliner,而不是 bash 脚本。

【问题讨论】:

  • rename .aaa .bbb *.aaa?
  • 是否应该递归复制?
  • 不重要。不递归就足够了
  • @user972014: 目标目录是空的吗?

标签: linux bash shell grep cut


【解决方案1】:

我觉得你的问题有点太复杂了,如果目标目录是空的,你可以用下面的one-liner来做到这一点:

cp a/*.aaa b; rename 's/aaa$/bbb/' b/*.aaa

该脚本使用两个带有; 的命令在第一个之后执行第二个。

cp a/*.aaa b

将所有模式为a/*.aaa 的文件复制到b 目录。通过一次调用执行此操作,该命令也将比使用管道更有效。

Next rename 是一个实用工具,用于对文件名执行正则表达式查找和替换。通过指定b/*.aaa,您将使用*.aaa 正则表达式重命名b 中的所有文件。现在您只需要指定要替换的内容,这是通过正则表达式完成的:

s/aaa$/bbb/

aaa$ 表示最后三个字符必须是aaa,并且您将每个文件的它们替换为bbb

【讨论】:

  • 似乎有效。谢谢!只是出于好奇 - 我如何使用我的方法完成它?
  • @user972014:我假设\.bla\.aaa。第一个问题可能是cutcut 第一部分,因此名为foo.bar.aaa 的文件将被剪切为foo。但总的来说,我发现xarg 很容易出错,而且目前我没有完整的 linux shell 可用。
  • @CommuSoft 我很好奇你在使用 xargs 时会遇到什么样的错误?
  • @JID:没有错误,但使用xarg 通常更难,因为它是一个额外的间接级别。问题不是xarg 本身,而是人类对间接推理的技能。我会尽可能避免xarg。此外,它的效率有点低,因为它为每个项目生成一个进程:cp 一次执行所有复制,而使用元素方式 cp 每次都会构造一个新进程。
  • 是的,我同意这不是最好的选择,但我经常使用它而不是 exec 和 find,因为我发现它更加通用,而且我从来没有真正遇到过使用它的任何问题。只是好奇是否有任何错误或任何东西:)
【解决方案2】:

另一种方式

cp -r a/ b/;for i in b/*; do mv {$i%.aaa}{.aaa,.bbb};done

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2018-03-13
    • 1970-01-01
    • 1970-01-01
    • 2016-06-06
    • 1970-01-01
    • 2011-08-18
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多