shuf
コマンドには--output
フラグがあり、これを使用して(stdoutに書き込む代わりに)出力を書き込む場所を指定できます。
ファイルをインプレースでシャッフルしたい。出力ファイル名と読み取るファイルに同じファイル名を使用して、shuf file --output file
を使用しても安全ですか?
または、これによりファイルが破損する可能性はありますか?プラットフォーム固有ですか?小さなファイルでテストしたところ、問題なく動作するようですが、manページにはこれについて何も書かれておらず、心配する必要があるかどうかわかりません。
はい- ドキュメントごとに -ファイルをその場でシャッフルしても安全です:
-o output-file
--output=output-file
標準出力の代わりにoutput-fileに出力を書き込みます。shuf
は、開く前にすべての入力を読み取るoutput-fileので、shuf -o F <F
やcat F | shuf -o F
などのコマンドを使用してファイルを安全にシャッフルできます。
あなたが言ったように、小さなファイルのスポットテストはあなたが望むことをするようですが、あなたが安全になりたければ、最良のオプションは一時ファイルに書き込んでから新しいファイルを入れ替えることです:
#!/bin/bash
scratch=$(mktemp)
trap 'rm -f "$scratch"' EXIT
if [[ -r "$1" ]]; then
shuf "$1" --output "$scratch" && mv "$scratch" "$1"
fi
上記のスクリプトはeとして保存できます。 g。 shuf_in_place
をPATH
に入れます。