
現在、Minecraft ゲーム サーバーの起動スクリプトを作成しています。このスクリプトには、バックアップ スクリプトが含まれています。
このバックアップ スクリプトはほぼ完璧に動作しますが、フォルダーの内容を削除する代わりに、別のフォルダー (同様の名前) を作成するだけで、対象のフォルダーに対しては何も行いません。
このコマンドを使用しています:rm -rf "$MINECRAFT_PATH/server.log backups/*"
このコマンドは bash スクリプトで実行されます。
変数に$MINECRAFT_PATH
は正しいパスが含まれています。作成されたフォルダーの名前は次のようになります: (とserver.log.backups
の間のドットに注意してください)。ただし、対象のフォルダーの名前は次のようになります: 。このフォルダーは存在しており、これは問題ではありません。log
backups
server.log backups
答え1
Bash の二重引用符はコンテンツのほとんどのリテラル値を保持するため、*
glob は に文字通り渡されrm
、 と呼ばれるファイルまたはフォルダーを削除しようとします*
。$MINECRAFT_PATH
ただし、 は置き換えられます。
おそらくあなたが望むのは次のようなものです:
rm -rf "$MINECRAFT_PATH/server.log backups/"*
これにより、フォルダーの内容が削除されますserver.log backups
。
いくつかの代替案:
スクリプトをより防御的にプログラムして、
-f
のオプションを削除することrm
もできます。その場合、server.log backups
フォルダーが空の場合は、glob が展開されずにそのまま渡されず、 というファイルは存在しないため、失敗しますserver.log backups/*
。rm -rf
フォルダ全体を単純にその後に実行することもできますmkdir -p
。または、フォルダ内のすべてのファイルとフォルダを深さ優先で削除することもできます
server.log backups
。-mindepth 1
親が削除されるのを防ぎます。find "$MINECRAFT_PATH/server.log backups" -mindepth 1 -depth -delete