web-dev-qa-db-ja.com

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

~/Desktopにあるディレクトリ名fooを持っています。同じ名前で同じ場所に端末からディレクトリを作成するとします。 mkdirを試したときにエラーが発生しました。

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

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

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

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

8
nux

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

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

次に使用できます:

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

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

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

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

muruの提案 (および Rinzwindの詳細 )、など、 rsyncを確認することをお勧めしますバックアップのニーズを満たします。 rsyncドキュメンテーションページこのUbuntu rsyncガイド には、いくつかの追加の有用なガイドがあります。

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

mkdir はディレクトリを作成します( "mk" "make" の略)。また、ディレクトリを再帰的に削除すると、ディレクトリ内のすべてのファイルが不良になります。データ損失につながる可能性のある方法で 最小の驚きの原則 に違反するためです。

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

14
Eliah Kagan

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

どうして?

これがUnixの哲学です。1つのことを実行し、それをうまく実行するプログラムを作成します。連携するプログラムを作成します。1

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

1nixプログラミングの技術、エリックS.レイモンド、ダグマキロイを引用しています。

6
muru

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

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

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

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

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

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

3
Rinzwind

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

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

1
Rea Haas