xargs 回声`回声{} | sed 's/pattern/replace/'` 不起作用,但对于每个循环都有效

xargs echo `echo {} | sed 's/pattern/replace/'` doesn't work but for each loop works

我想做的相当于:

for i in `ls -1`; do echo $i | mv $i `sed 's/profile/account/'`; done

xargs

ls -1 | xargs -I{} mv {} `echo {} | sed 's/profile/account/'`

但是在反引号内的竖线之后的sed被忽略了。 有人知道为什么会这样吗?

编辑:更多信息

根本问题只是简单地在直接给定的模式替换中重命名文件(此处将 profile 替换为 account,但是通过 for in 循环文件来解决。

我提出的问题是为什么以下内容不起作用。

ls -1 | xargs -I{} mv {} `echo {} | sed 's/profile/account/'`

为什么

`echo {} | sed 's/profile/account/'`

部分不是 return 替换文件名而是原始文件名。好像 | 在反引号内不起作用。

以不同的方式写问题:

如果我在名为 list.txt

的文件中有一个列表
profile1.txt
profile2.txt 

并且想要生成

account1.txt
account2.txt 

在单独对每一行进行操作时,我可以 运行 在其上执行命令。

cat list.txt | xargs -I{} echo `echo {} | sed 's/profile/account/'`

为什么命令 return:

profile1.txt
profile2.txt 

而不是将个人资料更改为帐户?

这可能对你有用(GNU 并行):

parallel 'old={}; new=${old/profile/account}; echo mv $old $new' ::: *

选中后删除echo

同意上面关于使用 shell glob 扩展而不是 ls -1 的评论,或者使用 prename 的直接解决方案,但是这个练习也很有趣,如果你想提供管道其他输出(例如 find 或类似的)。

下面通过调用一个迷你脚本来完成它,其中它的参数是每个 xargs 馈线,使用 var 替换 bash-isms(注意缩小的 ls ... 能够重新-运行这些没有错误):

ls -1 *profile* | xargs -l1 bash -xc 'echo mv "" "${1/profile/account}"' --

注意上面是dry-运行,删除echo实际做。

示例中:

cat list.txt | xargs -I{} echo `echo {} | sed 's/profile/account/'`

xargs 不会在反引号内插入 {}

所以:

`echo {} | sed 's/profile/account/'`

呼应文字 {}。随后的 sed 不会更改 {}

`echo {} | sed 's/profile/account/'`

将 return: {}

给出:

cat list.txt | xargs -I{} echo {}