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 {}
我想做的相当于:
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 {}