我正在尝试流程替换,这只是一个有趣的练习。
我想将字符串“XXX”附加到'ls'的所有值:
paste -d ' ' <(ls -1) <(echo "XXX")
为什么这不起作用? XXX未附加。但是,如果我想将文件名附加到自身,例如
paste -d ' ' <(ls -1) <(ls -1)
它有效。
我不明白这种行为。 echo和ls -1都写入stdout,但不会通过paste读取echo的输出。
答案 0 :(得分:4)
尝试这样做,使用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"
答案 1 :(得分:1)
如果你想在XXX
输出的每一行之后ls -l
,你需要第二个输出x乘以字符串的命令。您只回显一次,因此它将仅附加到ls
输出的第一行。
如果您要搜索一个小命令行来完成任务,可以使用sed
:
ls -l | sed -n 's/\(^.*\)$/\1 XXX/p'
答案 2 :(得分:1)
这是一个有趣的,除了传说中的yes
命令外没有使用任何外部命令!
while read -u 4 head && read -u 5 tail ; do echo "$head $tail"; done 4< <(ls -1) 5< <(yes XXX)
(我只是张贴这个,因为它很有趣,实际上它不是100%的主题,因为它使用文件描述符和进程替换)
答案 3 :(得分:1)
......你必须:
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
答案 4 :(得分:0)
它只对第一行执行,因为它将参数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
答案 5 :(得分:0)
您可以使用xargs获得相同的效果:
ls -1 | xargs -I{} echo {} XXX