【发布时间】:2019-03-25 12:24:08
【问题描述】:
我想做相当于:
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
而不是将个人资料更改为帐户?
【问题讨论】:
-
echo {} ...周围引用错误? -
首先,请don't parse ls.. 使用
for i in *.. 其次,put variables inside double quotes 除非你有其他原因......最后,你能解释一下你正在尝试的问题是什么解决?理想情况下,给我们一两个文件名,以及您对这些文件的预期输出是什么 -
你可以直接在shell变量上使用parameter expansion而不是调用
sed(除非你需要正则表达式功能)
标签: linux shell sed command xargs