[英]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
被忽略。 有誰知道為什么會這樣?
根本問題只是直接給定模式替換重命名文件(這里用account
替換profile
,但是通過文件的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
而不是將個人資料更改為帳戶?
這可能對您有用(GNU 並行):
parallel 'old={}; new=${old/profile/account}; echo mv $old $new' ::: *
檢查后刪除echo
。
同意上面關於使用 shell glob 擴展而不是ls -1
,或者使用prename
的直接解決方案,但是如果您想為管道提供其他輸出(例如find
或類似的),這個練習也很有趣。
下面是通過調用一個 mini scriptlet 來實現的,其中它的參數是每個xargs
饋送行,使用 var 替換 bash-isms(注意縮小的ls ...
以便能夠重新運行它們而不會出錯):
ls -1 *profile* | xargs -l1 bash -xc 'echo mv "$1" "${1/profile/account}"' --
注意上面是試運行,刪除echo
以實際執行。
在示例中:
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 {}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.