如何将文件名打印到自身中

如何将文件名打印到自身中

我在 foo 目录中有多个文件(100-1000)。我想将每个文件名附加到其自己的内容中。我认为 for 循环应该解决为每个文件附加一个随机字符串的问题,

for f in *; do printf "%10s \n" $(shuf -i 50-100 -n 50 -r) >> $f; done

如何将文件名附加到所有这些打乱的数字中,直接连接它们?

for f in *; do printf "%10s \n" $f $(shuf -i 50-100 -n 50 -r) >> $f; done

结果文件5:

5
67
89
69
...

预期结果:

567
589
569
...

答案1

将 的结果存储shuf到 bash 数组中,然后在参数扩展中使用替换来添加$f:

mapfile -t shuf < <(shuf -i 50-100 -n 50)
printf '%10s \n' "${shuf[@]/#/"$f"}" >>"$f"

对于 zsh,使用^参数扩展:

printf '%10s \n' "$f${(f)^"$(shuf -i 50-100 -n 50)"}" >> "$f"

答案2

好的,如果我没猜错的话,您想在 打印的所有数字前添加一个固定字符串shuf。如果是这样,只需将该字符串添加到格式字符串的开头printf

$ printf "x%10s\n" $(shuf -i 50-100 -n 3 -r)
x        71
x        70
x        92

更改%10s%s使它们背靠背,没有空格。同样,您可以使用循环变量来代替:

$ for f in 1 2 3; do printf "$f%s\n" $(shuf -i 50-100 -n 2 -r); done
151
197
268
256
364
354

添加>> "$f"重定向到文件。

请注意,由于固定部分是此处格式字符串的一部分,因此任何%符号和反斜杠都将由 解释printf

相关内容