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


11

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

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

それは理にかなっていますが、foo存在する場合は置き換えたいと思います。よく見ましman mkdirたが、それを行うオプションはありません。

では、fooディレクトリを上書きする方法は?

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


fooそれのすべてのコンテンツを削除するように置き換えますか?ディレクトリが存在するかどうかを無視mkdirする-pオプションがあります。
muru、2014

4
それで、誤って同じ名前で新しいディレクトリを作成したときに、ディレクトリ内のすべてのファイルを削除するコマンドが必要ですか?そして、それがなぜオプションではないのか疑問に思いますか?これは冗談ですか?
マーティ揚げ14

downvotersは、なぜそれを明確にして、既存のディレクトリを削除する1つのコマンドについて尋ねています
nux

1
@nux私には質問が意味をなさない...ディレクトリを削除して再作成する理由を説明してください。ディレクトリに対して行う必要のあるすべての操作を行うコマンドがあります。mkdirには、削除/再作成するオプションは必要ありません。
Rinzwind 2014

1
論理的な質問をしている場合、それはここでの犯罪ですか?
nux 2014

回答:


21

目的が次の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リストバッシュリファレンスマニュアルの詳細と説明については;&||、および&&オペレーター。

以下のようmuruが提案(とRinzwindが詳述)、私はあなたがに見てお勧めしますrsync、それはあなたのバックアップニーズを満たすかどうかを確認します。rsyncのドキュメントページとこのUbuntu rsyncガイドに役立つ追加のガイドがいくつかあります。

なぜmkdirにこのオプションがないのですか?

mkdirディレクトリを作成します(「mk」は「make」を表します)。また、ディレクトリとその中のすべてのファイルを再帰的に削除することは、データの損失につながる可能性のある方法で驚きを最小限に抑えるという原則に違反するため、好ましくありません。

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


+1すばらしい。この答えは構文の説明にとどまらず、stackexchangeサイトでもっと深めたいと思います。この回答には多くのゴールデンナゲットがあります。
Govind Rai 2017

7

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

どうして?

これは、Unixの哲学です。1つのことを行い、それをうまく行うプログラムを作成します。一緒に動作するプログラムを作成します。1

この場合、mkdirrmコマンドは必要なことを実行し、連携して機能rm -rします。これにより、ディレクトリも削除されるため、後続のコマンドでディレクトリmkdirが作成されます。

1 Art of Unix Programming、Eric S. Raymond、それ自体がDoug McIlroyを引用。


今のところ、それは良い答えです。私はそれを検索します
nux '28 / 08/28

3

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

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

コメントに示されているように、;(=最初が失敗しても両方を実行する)または&&(= rmが失敗しない場合はmkdirのみ)でそれらをチェーンできます 。

-rDIRSを除去するためのものです。最初のコマンドは、ディレクトリのすべての内容も削除します。それはあなたの意図されていない場合は、RMとMKDIRの両方は、あなたが探しているものではありません:パーミッションですchmodchown

なぜmkdirにこのオプションがないのですか?

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


私はそれを知っています、しかし私は1つのコマンドを意味します、あなたは私の編集を表示できます私はそれを変更します
nux

まず、ディレクトリを再作成する必要がある理由を説明します。それは私には意味がありません。
Rinzwind 2014

私の必要性は理にかなっていますか?それは私にとって意味があります:)
nux '28

@nuxいいえ、ありません。また、mkdirのメンテナも理由を理解しません;)あなたが望むものは役に立たず、メリットがありません。
Rinzwind 2014

あなたがfooの同じ名前で新しいディレクトリにバックアップを作成するためのスクリプトを作る午前を知りたいと存在する場合はスペースを削減するためにそれを置き換えることができます場合は、[OK]
NUX

1

最もクリーンな方法でこれを行うには、これを使用します。

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. 新しいディレクトリを作成して成功をエコーするか、失敗した場合はエコーが失敗しました。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.