rm -rfはフォルダの内容を削除せず、代わりに別の空のフォルダを作成します。

rm -rfはフォルダの内容を削除せず、代わりに別の空のフォルダを作成します。

現在、Minecraft ゲーム サーバーの起動スクリプトを作成しています。このスクリプトには、バックアップ スクリプトが含まれています。

このバックアップ スクリプトはほぼ完璧に動作しますが、フォルダーの内容を削除する代わりに、別のフォルダー (同様の名前) を作成するだけで、対象のフォルダーに対しては何も行いません。

このコマンドを使用しています:rm -rf "$MINECRAFT_PATH/server.log backups/*"
このコマンドは bash スクリプトで実行されます。

変数に$MINECRAFT_PATHは正しいパスが含まれています。作成されたフォルダーの名前は次のようになります: (とserver.log.backupsの間のドットに注意してください)。ただし、対象のフォルダーの名前は次のようになります: 。このフォルダーは存在しており、これは問題ではありません。logbackupsserver.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
    

関連情報