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

时间:2018-10-21 04:50:06

标签: linux shell sed command xargs

我想做的等同于:

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/'`

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

用不同的方式写问题:

如果我有一个列表,例如文件list.txt

profile1.txt
profile2.txt 

并想生成

account1.txt
account2.txt 

虽然分别在每行上操作,所以我可以在其上运行命令。

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

为什么命令返回:

profile1.txt
profile2.txt 

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

3 个答案:

答案 0 :(得分:0)

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

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

一旦选中,请删除echo

答案 1 :(得分:0)

同意上面关于使用shell glob扩展而不是ls -1的评论,或者使用prename的简单解决方案,但是,如果您想向管道提供其他输出(例如, find之类的。

下面通过使用var替换bash-isms调用其参数分别为每个xargs填充行的微型scriptlet来实现此操作(请注意,缩小的ls ...能够无错误地重新运行它们) :

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

上面的注释是试运行,请删除echo来进行。

答案 2 :(得分:0)

在示例中:

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

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

所以:

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

回显文字{}。后续的sed不会更改{}

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

将返回:{}

哪个给:

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