1

我正在尝试流程替换,这只是一个有趣的练习。

我想将字符串“XXX”附加到“ls”的所有值:

paste -d ' ' <(ls -1) <(echo "XXX")

这怎么行不通?不附加 XXX。但是,如果我想将文件名附加到自身,例如

paste -d ' ' <(ls -1) <(ls -1)

有用。

我不明白这种行为。echo 和 ls -1 都写入标准输出,但粘贴不读取 echo 的输出。

4

6 回答 6

4

尝试这样做,使用printfhack 来显示具有零长度输出和附加 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" 
于 2013-10-28T18:54:36.823 回答
1

这里有一个有趣的,除了传说中的命令,没有使用任何外部yes命令!

while read -u 4 head && read -u 5 tail ; do echo "$head $tail"; done 4< <(ls -1) 5< <(yes XXX)

(我发布这个只是因为它很有趣,而且它实际上不是 100% 偏离主题,因为它使用文件描述符和进程替换)

于 2013-10-28T19:20:45.970 回答
1

... 你必须:

for i in $( ls -1 ); do echo "$i XXXX"; done

永远不要使用for i in $(command). 有关更多详细信息,请参阅此答案

所以,要回答这个原始问题,你可以简单地使用这样的东西:

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
于 2013-10-28T20:44:24.730 回答
1

如果你想要XXX在每一行ls -l输出之后,你需要第二个命令输出 x 倍的字符串。您只回显一次,因此它只会附加到ls输出的第一行。

如果您正在寻找一个小命令行来完成您可能使用的任务sed

ls -l | sed -n 's/\(^.*\)$/\1 XXX/p'
于 2013-10-28T18:51:13.313 回答
0

您可以使用 xargs 获得相同的效果:

ls -1 | xargs -I{} echo {} XXX
于 2013-10-28T20:03:27.327 回答
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
于 2013-10-28T18:54:10.687 回答