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

Mur*_*lik 3 linux command-line bash shell-script

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

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

如何将文件名附加到所有这些混洗过的数字中,直接将它们连接起来?

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

结果在文件 5:

5
67
89
69
...
Run Code Online (Sandbox Code Playgroud)

预期结果:

567
589
569
...
Run Code Online (Sandbox Code Playgroud)

gue*_*est 6

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

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

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

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


ilk*_*chu 5

好的,如果我猜对了,您想在所有由shuf. 如果是这样,只需将该字符串添加到printf格式字符串的开头:

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

更改%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
Run Code Online (Sandbox Code Playgroud)

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

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

  • @glennjackman,确实,除了它不起作用。:) 你不能引用 `shuf` 的输出,因为它依赖于分词。即便如此,你也只能得到一次固定的部分,试试像 `printf "%s %s\n" xx $(shuf -i 50-100 -n 4 -r)` 这样的东西。 (2认同)