如何模式替换来自管道传递给另一个shell命令的shell命令的结果

时间:2015-02-07 05:18:09

标签: shell csh

我有很多文件有奇怪的命名。例如,目录中的file_1_0_a32.elf , file_2_1_a32.elf, file_3_2_a32.elf。我想将文件重命名为新名称,删除文件_1_a32中的file_2_1_a32.elf,因此名称变为file_2.elf。我可以使用mv轻松编写包含文件列表和新名称的文件并执行该文件。我想知道我是否可以通过命令行本身来做到这一点。我希望xargs命令在这里有用。这就是我能提出ls *.elf | xargs -i mv {} modifiedFileName的全部内容。我不知道如何完成这个。基本上我想要另一个阶段来纠正ls返回的文件名,并保留原始名称,以便我可以将其用作mv的参数。有没有办法可以做到?

1 个答案:

答案 0 :(得分:1)

此用例有一个工具:rename

rename 's/_\d_a32//' *.elf

xargs用例是按原样使用管道值。如果要修改管道值并且具有原始值,则xargs不适合作业。在这种情况下,最好在bash参数扩展中使用while read循环与搜索和替换相结合。

ls *.elf | while read -r filename
do
  mv "$filename" "${filename/_?_a32}"
done

有关在bash参数扩展中搜索和替换的详细信息:http://wiki.bash-hackers.org/syntax/pe#search_and_replace

请注意,这会在不询问的情况下覆盖:file_1_0_a32.elffile_1_1_a32.elf都会被重写为file_1.elf并覆盖一个_3_a32。如果下划线之间的数字是单个数字,则它仅替换模式(替换为:_13_a32,未替换:_x_a32)。如果下划线之间有任何单个字符,它也会替换模式(替换为rename)。不幸的是,没有简单的方法来解决这个限制而不使用其他工具(提示:rename是这个用例的好工具)。

{{1}}工具有时称为prename(perl rename),通常作为perl包的一部分安装。以下是ubuntu中的联机帮助页:http://manpages.ubuntu.com/manpages/trusty/man1/prename.1.html