![结合 xargs、sed 和命令替换](https://linux22.com/image/159811/%E7%BB%93%E5%90%88%20xargs%E3%80%81sed%20%E5%92%8C%E5%91%BD%E4%BB%A4%E6%9B%BF%E6%8D%A2%20.png)
我期望在 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/' {} +