复制具有特定扩展名的所有文件到另一个目录,并更改扩展名。

5
我想要从目录a复制所有扩展名为aaa的文件到目录b,并将扩展名替换为bbb。我尝试执行以下操作:
ls a | grep \.bla$ | cut --delimiter=. -f 1 | xargs cp a/{}.aaa b/{}.bbb

但这个方法有点复杂,我想要一个简单的一行命令,而不是一个bash脚本。

rename .aaa .bbb *.aaa? - Etan Reisner
1
复制操作是否应该递归进行? - Willem Van Onsem
不重要。非递归就足够了。 - user972014
@user972014:目标目录是空的吗? - Willem Van Onsem
2个回答

5

我认为您把问题想得有点复杂了。如果目标目录为空,您可以使用以下一行命令:

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

该脚本使用两个命令,中间用;分隔,以便在第一个命令执行后立即执行第二个命令。
cp a/*.aaa b

复制所有带有模式 a/*.aaa 的文件到目录 b。通过一次调用来完成此操作,该命令比使用管道更有效率。
接下来,rename 是一种实用工具,可在文件名上执行正则表达式“查找和替换”。通过指定 b/*.aaa,您将重命名 b 中的所有文件为 *.aaa 正则表达式。现在,您只需要指定要替换的内容,这可以通过正则表达式完成:
s/aaa$/bbb/

aaa$ 表示文件名的后三个字符必须为 aaa,将其替换为 bbb


看起来可以工作。谢谢!只是出于好奇 - 我如何使用我的方法完成它? - user972014
@user972014:我猜\.bla\.aaa。第一个问题可能是cut将会切掉第一部分,所以文件名为foo.bar.aaa的文件将会被切成foo。但总的来说,我发现xarg相当容易出错,而且目前我没有完整的Linux shell可用。 - Willem Van Onsem
@CommuSoft 我很好奇你在使用 xargs 时会遇到什么样的错误? - user4453924
@JID:没有错误,但是使用xarg通常更加困难,因为它有一个额外的间接层级。问题不在于xarg本身,而在于人类对间接性推理的技能。我会尽可能避免使用xarg。此外,由于每个项都会生成一个进程,效率略低:虽然cp一次执行所有复制操作,但是使用元素级别的cp将每次构建一个新进程。 - Willem Van Onsem
1
是的,我同意这不是最佳选择,但我经常使用它来代替在find中使用exec,因为我发现它更加灵活,而且我从来没有遇到过任何问题。只是好奇是否存在任何错误或其他问题 :) - user4453924

3
另一种方式
cp -r a/ b/;for i in b/*; do mv {$i%.aaa}{.aaa,.bbb};done

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接