结合 xargs、sed 和命令替换

结合 xargs、sed 和命令替换

我期望在 bash 下得到以下结果:

 ls *.py | xargs -I{} echo $(echo {} | sed 's/\.py/_2\.py/g')

列出目录中包含的所有 .py 文件,但在文件名后面和 .py 扩展名之前附加 _2。

然而事实并非如此。它只是列出目录中的 .py 文件,没有任何更改。

简而言之:

$ ls
A.py  B.py

$ ls *.py | xargs -I{} echo $(echo {} | sed 's/\.py/_2\.py/g')
A.py
B.py

而我预期的输出是:

A_2.py
B_2.py

这里发生了什么以及如何获得预期的输出?

答案1

发生这种情况是因为子 shell 中的命令即

echo {} | sed 's/\.py/_2\.py/g'

在 echo 之前执行,因此在此命令之后的命令将是:

xargs -I{} echo {}

这将简单地回显所有文件名。

您可以使用查找命令:

find directory_name -name '*.py' \
-exec rename 's/.py/_2.py/' {} +

它只需一个命令即可重命名所有文件。

要仅查找当前目录中的文件而不是子目录中的文件,请使用maxdepth 1选项 ie:

find directory_name -maxdepth 1 -name '*.py' \
-exec rename 's/.py/_2.py/' {} +

相关内容