文件名中的批处理模式替换

时间:2017-03-19 14:16:51

标签: bash command-line

我多次遇到这个问题,我很想知道是否有任何命令行机制我不知道可以解决它。

让我们考虑一下我有一组文件,我想重命名,用另一个文件更改名称中的前缀。

重命名:

foo_a.png
foo_b.png
foo_c.png

要:

bar_a.png
bar_b.png
bar_c.png

在一个命令行中,而不是在脚本中。

以下是我所知道的接近此问题的一些解释。

我知道如何方便地迭代这些文件,例如将它们转换为另一种格式。

find . -name "foo*png" |xargs -I G mv G bar_G

这实际上是作弊,因为它将旧文件名重新用作新文件名的一部分。

请详细说明答案中使用的命令。

1 个答案:

答案 0 :(得分:1)

@ jm666评论说你可以使用重命名,但不能打败它 如果您想手动执行此操作并在iy中支持带换行符的文件名,则手动编写将导致

find . -name foo\*png -print0 2>/dev/null |
xargs -0 -I G bash -c 'newfile=$(sed 's/foo/bar/' <<< "G") ; mv "G" "${newfile}"'

我想你会选择

rename foo bar foo*png

编辑:带有find的行未格式化为代码。 和 解释find print0 + xargs -0(或xargs -null): 文件名可以包含空格和换行符。如果要使用换行符处理文件名,则无法逐行解析查找输出 例如:

touch "an
> example"
find . -name an\* | xargs -I G echo "==G=="
==./an==
==example==
find . -name an\* -print0 | xargs -0 -I G echo "==G=="
==./an
example==