我正在嘗試進程替換,這只是一個有趣的練習。bash:進程替換,粘貼和回顯
我想字符串「XXX」追加到「LS」的所有值:
paste -d ' ' <(ls -1) <(echo "XXX")
如何走到這一步不工作? XXX未被附加。但是,如果我想附加文件名稱本身如
paste -d ' ' <(ls -1) <(ls -1)
它的工作原理。
我不明白這個行爲。 echo和ls -1都寫入stdout,但echo的輸出不是通過粘貼讀取的。
我正在嘗試進程替換,這只是一個有趣的練習。bash:進程替換,粘貼和回顯
我想字符串「XXX」追加到「LS」的所有值:
paste -d ' ' <(ls -1) <(echo "XXX")
如何走到這一步不工作? XXX未被附加。但是,如果我想附加文件名稱本身如
paste -d ' ' <(ls -1) <(ls -1)
它的工作原理。
我不明白這個行爲。 echo和ls -1都寫入stdout,但echo的輸出不是通過粘貼讀取的。
它確實只在第一線,因爲這組從參數1第一行與第一從參數2行:
paste -d ' ' <(ls -1) <(echo "XXX")
...輸出:
/dir/file-a XXXX
/dir/file-b
/dir/file-c
...你必須:
for i in $(ls -1); do echo "$i XXXX"; done
如果您想要使用粘貼,您需要一個包含初始化爲「XXX」的元素的數組,因爲文件存在於您要列出的目錄中。我認爲這很簡單(甚至有些人可能會說,不那麼優雅)使用迭代,如我在上面的答案。 – Ricardo
千萬不要在'$(command)中使用'for i' 查看此答案以獲取更多詳細信息:http://stackoverflow.com/questions/19606864/ffmpeg-in-a-bash-pipe/19607361#19607361 –
如果你想在ls -l
輸出的每一行之後輸入XXX
,你需要第二個輸出x次字符串的命令。您只回響一次,因此它會附加到第一行ls
輸出。
如果你正在尋找一個微小的命令行來實現任務你可以使用sed
:
ls -l | sed -n 's/\(^.*\)$/\1 XXX/p'
嘗試這樣做,使用printf
黑客以顯示與零長度的輸出,並追加XXX文件。
paste -d ' ' <(ls -1) <(printf "%.0sXXX\n" * )
演示:
$ ls -1
filename1
filename10
filename2
filename3
filename4
filename5
filename6
filename7
filename8
filename9
輸出:
filename1 XXX
filename10 XXX
filename2 XXX
filename3 XXX
filename4 XXX
filename5 XXX
filename6 XXX
filename7 XXX
filename8 XXX
filename9 XXX
如果你只是想追加XXX,這將是一個更簡單:
printf "%sXXX\n"
這裏還有一個有趣的一個,除了th之外不使用任何外部命令e傳奇yes
命令!
while read -u 4 head && read -u 5 tail ; do echo "$head $tail"; done 4< <(ls -1) 5< <(yes XXX)
(我只張貼這是因爲它很有趣,它實際上不是100%題外話,因爲它使用文件描述符和工藝替代)
可以使用xargs的達到相同的效果:
ls -1 | xargs -I{} echo {} XXX
...你必須:
for i in $(ls -1); do echo "$i XXXX"; done
切勿使用for i in $(command)
。有關更多詳情,請參閱this answer。
因此,要回答這個原來的問題,你可以簡單地使用這樣的事情:
for file in *; do echo "$file XXXX"; done
另一種解決方案使用awk:
ls -1|awk '{print $0" XXXX"}'
awk '{print $0" XXXX"}' <(ls -1) # with process substitution
另一種解決方案使用sed:
ls -1|sed "s/\(.*\)/\1 XXXX/g"
sed "s/\(.*\)/\1 XXXX/g" <(ls -1) # with process substitution
無用的解決方案,只是爲了好玩:
while read; do echo "$REPLY XXXX"; done <<< "$(ls -1)"
ls -1|while read; do echo "$REPLY XXXX"; done
'echo'只產生一行; 'paste'需要由'ls'生成的每一行需要一個字符串。 – chepner