web-dev-qa-db-ja.com

shuf file-出力ファイル:インプレースシャッフル

shufコマンドには--outputフラグがあり、これを使用して(stdoutに書き込む代わりに)出力を書き込む場所を指定できます。

ファイルをインプレースでシャッフルしたい。出力ファイル名と読み取るファイルに同じファイル名を使用して、shuf file --output fileを使用しても安全ですか?

または、これによりファイルが破損する可能性はありますか?プラットフォーム固有ですか?小さなファイルでテストしたところ、問題なく動作するようですが、manページにはこれについて何も書かれておらず、心配する必要があるかどうかわかりません。

4
D.W.

はい- ドキュメントごとに -ファイルをその場でシャッフルしても安全です:

-o output-file
--output=output-file
標準出力の代わりにoutput-fileに出力を書き込みます。 shufは、開く前にすべての入力を読み取るoutput-fileので、shuf -o F <Fcat F | shuf -o Fなどのコマンドを使用してファイルを安全にシャッフルできます。

6
don_crissti

あなたが言ったように、小さなファイルのスポットテストはあなたが望むことをするようですが、あなたが安全になりたければ、最良のオプションは一時ファイルに書き込んでから新しいファイルを入れ替えることです:

#!/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_placePATHに入れます。

1
DopeGhoti