该shuf
命令有一个--output
标志,您可以使用它来指定将其输出写入何处(而不是写入 stdout)。
我想就地打乱文件。shuf file --output file
使用相同的文件名作为输出文件名和要读取的文件是否安全?
或者这会导致文件损坏吗?它是特定于平台的吗?当我在一个小文件上测试时,它似乎工作正常,但手册页没有说明这一点,我不确定是否要担心它。
答案1
是的 -根据文档- 就地洗牌文件应该是安全的:
-o output-file
--output=output-file
将输出写入输出文件而不是标准输出。shuf
打开之前读取所有输入输出文件shuf -o F <F
,因此您可以使用和等命令安全地对文件进行适当的洗牌cat F | shuf -o F
。
答案2
正如您所说,对一个小文件进行现场测试似乎可以满足您的要求,但如果您想安全,最好的选择是写入临时文件,然后将新文件交换到:
#!/bin/bash
scratch=$(mktemp)
trap 'rm -f "$scratch"' EXIT
if [[ -r "$1" ]]; then
shuf "$1" --output "$scratch" && mv "$scratch" "$1"
fi
上面的脚本可以保存为例如shuf_in_place
您的PATH
.