簡體   English   中英

xargs echo `echo {} | 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被忽略。 有誰知道為什么會這樣?

編輯:更多信息

根本問題只是直接給定模式替換重命名文件(這里用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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM