我有很多文件有奇怪的命名。例如,目录中的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
的参数。有没有办法可以做到?
答案 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.elf
和file_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