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