既存のディレクトリを上書きしますか?

既存のディレクトリを上書きしますか?

fooにディレクトリ名があります~/Desktop。ターミナルから同じ名前で同じ場所にディレクトリを作成したいとします。試してみるとmkdirエラーが発生しました:

mkdir: cannot create directory `/home/nux/Desktop/foo': File exists

それは理にかなっていますが、存在する場合は置き換えたいですfooman mkdirしかし、それを実行するオプションはありません。

では、fooディレクトリを上書きするにはどうすればよいでしょうか?

なぜmkdirこれを行うオプションがないのですか?

答え1

次のような 1 行のコマンドを実行することが目標である場合:

  • ディレクトリが~/Desktop/fooすでに存在する場合は削除して再作成します。
  • ディレクトリ~/Desktop/fooがまだ存在しない場合は、単に作成します。

次に、以下を使用できます。

rm -r ~/Desktop/foo; mkdir ~/Desktop/foo

;は改行と同じですが、1 行で複数のコマンドを実行できます (つまり、「単一のコマンド」として)。

  • 削除するディレクトリに読み取り専用ファイルが含まれている可能性がある場合は、-fユーザーに対話的にプロンプ​​トを出さずにそれらを削除するには、フラグが必要です。これは問題ありませんが、特に注意することをお勧めしますrm -rf ...man rm詳細については。
  • コマンドが必要rmです仕上げるコマンドが実行される前にmkdir、 の;代わりにを使用します&。(先行するコマンドは&バックグラウンドで非同期的に実行されます。)
  • mkdirコマンドが成功したときに実行するコマンドが必要です。これが、 の代わりにrmを使用する理由です。;||
  • mkdirコマンドが失敗したときに実行するコマンドが必要ですrm(通常、失敗はディレクトリがまだ存在していなかったことを意味します)。これが、;の代わりにを使用する理由です&&
  • ディレクトリがすでに存在する場合でもコマンドrmが失敗する可能性があります。その場合、コマンドmkdirも失敗しますが、エラー メッセージは意味をなすものであり、ディレクトリの作成を試みる前に の存在を確認する中間ステップを追加する必要はおそらくありませんfoo

見る3.2.3 コマンドのリストの中にBash リファレンスマニュアル;、、、および演算子に関する詳細情報と説明については、 を参照して&ください。||&&

としてmuruが提案した(そしてリンツウィンドは詳しく説明した)、ぜひ調べてみることをお勧めしますrsyncバックアップのニーズを満たすかどうかを確認してください。rsync ドキュメントページ、 同様にこのUbuntu rsyncガイド

なぜ mkdir にはこのオプションがないのでしょうか?

mkdirディレクトリを作成します(「mk」「作る」の略)。ディレクトリとその中のすべてのファイルを再帰的に削除することも、驚き最小の原則データが失われる可能性が高い方法です。

rmdirディレクトリ以外のファイルが含まれているディレクトリも削除されません。rmオプションがありますが-r、これはファイルを削除することが想定されているため理にかなっていますrm(それが目的であるため、固有の危険性は直感的であり、ユーザーは通常、コマンドを実行するときに注意する必要があることを認識していますrm)。

答え2

いいえ、あなたが求めていることを実行する単一のコマンドはありません。

なぜ?

これが Unix の哲学です。1 つのことだけをうまくこなすプログラムを書き、連携して動作するプログラムを書きます。1

この例では、 コマンドmkdirrmコマンドが必要な処理を実行し、適切に連携します。 はrm -rディレクトリも削除するため、後続の はmkdirディレクトリを作成します。

1Unixプログラミングの芸術、エリック・S・レイモンド、自身もダグ・マキロイの言葉を引用している。

答え3

ディレクトリを削除するコマンドは ですrm。したがって、2 つのコマンドが必要です。

rm -r ~/Desktop/foo/
mkdir ~/Desktop/foo/

コメントに示されているように、 ;(= 1 番目が失敗した場合でも両方を実行する) または&&(= rm が失敗しない場合は mkdir のみを実行する) で連鎖させることができます。

-rディレクトリを削除するためのものです。最初のコマンドはディレクトリのすべての内容も削除します。それが目的でない場合は、rm と mkdir はどちらも必要なものではありません。権限は とchmodですchown

なぜ mkdir にはこのオプションがないのでしょうか?

あいまいです。mkdirディレクトリの作成を意味します。削除してディレクトリを作成するのではありません。また、このコマンドは内容を削除するためのものなので、ディレクトリを削除できるrm必要はありません。rmdir

答え4

これを最もきれいに行うには、次のようにします。

create_clean_directory(){
    dir_name=$1
    if [ -d "$dir_name" ]; then
        echo "Removing $dir_name"
        rm -rf "$dir_name"
    elif [ -f "$dir_name" ]; then
        echo "File with this name already exists, not a directory."
        exit
    fi
    if mkdir "$dir_name"; then
        echo "Clean directory created: $dir_name"
        return 0
    else
        echo "Creating directory failed: $dir_name"
        return 1
    fi 
}

そしてそれを使用するには:

create_clean_directory <dir_name>

これにより、削除しようとしているのがファイルではなくディレクトリであることが確認されます。

  1. -dその名前のディレクトリがすでに存在するかどうかを確認します。存在する場合は削除します。

  2. -fこの名前のファイルが存在しないことを確認します。存在する場合は、エラー メッセージを出力して終了します。

  3. 新しいディレクトリを作成し、成功をエコーし​​ます。失敗した場合は、失敗をエコーし​​ます。

関連情報