我想做的等同于:
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
不是将个人资料更改为帐户吗?
答案 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 {}