出力はどのくらい安全ですか?rmと同時に/*

出力はどのくらい安全ですか?rmと同時に/*

場合によっては、ディレクトリのすべての内容を削除し、そこに新しいファイルを作成する必要があります。次の操作を実行し、すべての新しいファイルが変更されていないままであることを期待できます。

% rm -rf regression/* & ( sleep 10 ; run_regression )

run_regression一意の名前を持つように、出力ファイルにタイムスタンプをどこに追加してから配置しますかregression

私の考えでは、シェルはregression/*明示的なリストに解析されると思います。既存のfilenameを選択すると、その明示的なrmリスト内のファイルは削除されますが、run_regression.filenameと同時に作成された新しいファイルは削除されませんrm。そのファイルにはタイムスタンプが付けられているため、run_regression名前の競合はありません。

しかし、シェルがファイルのリストを完了し、作業を開始した時期をどのように知ることができるかはわかりませんrm。上記の10秒で十分ですか?次のようにできますかbash

% rm -rf regression/* & ( wait_unil_names_are_resolved ; run_regression )

説明を明確にするために、シェルに慣れているツールであっても、ツールを呼び出す前にワイルドカードがファイル名に拡張されることを保証するかどうかをシェルに実際に尋ねています。シェルとツール開発者がパイプワイルドカードを拡張するためにツールを使用したいと思うかもしれません。このようなことが起こらないようにする標準があってほしいです。

ベストアンサー1

コマンドは機能しますが、テストケースは次のとおりです。

$ ls
$ echo * $(sleep 1)&touch file1
[1] 12798
$ file1

[1]+  Done                    echo * $(sleep 1)

file1 は入力ではなく、echo コマンドの出力です。

編集する:

別のテスト実行:

$ ls
$ touch file1
$ for i in {1..5000}; do rm * & touch file$i; wait;done|grep file
rm: cannot remove '*': No such file or directory
***previous line repeated 14 times***

おすすめ記事