~/Desktop
にあるディレクトリ名foo
を持っています。同じ名前で同じ場所に端末からディレクトリを作成するとします。 mkdir
を試したときにエラーが発生しました。
mkdir: cannot create directory `/home/nux/Desktop/foo': File exists
それは理にかなっていますが、foo
が存在する場合は置き換えたいと思います。 man mkdir
に目を通しましたが、それを行うオプションはありません。
foo
ディレクトリを上書きする方法は?
mkdir
にこれを行うオプションがないのはなぜですか?
目標が次の1行のコマンドを実行することである場合:
~/Desktop/foo
が既に存在する場合、削除して再作成します。~/Desktop/foo
ディレクトリーを作成します。次に使用できます:
rm -r ~/Desktop/foo; mkdir ~/Desktop/foo
;
は改行に相当しますが、1行で複数のコマンドを実行できます(つまり、「単一コマンド」として)。
-f
フラグが必要です。これは問題ありませんが、rm -rf ...
には特に注意することをお勧めします。詳細については man rm
をご覧ください。rm
コマンドを実行する前に、finishにmkdir
コマンドが必要です。これが、;
の代わりに&
を使用する理由です。 (&
に先行するコマンドは、バックグラウンドで非同期に実行されます。)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
コマンドを実行するときに注意する必要があります)。
いいえ、求めていることを実行する単一のコマンドはありません。
どうして?
これがUnixの哲学です。1つのことを実行し、それをうまく実行するプログラムを作成します。連携するプログラムを作成します。1
この場合、mkdir
およびrm
コマンドは必要なことを実行し、rm -r
はディレクトリも削除するため、連携して動作します。したがって、後続のmkdir
は作成されます。ディレクトリ。
1nixプログラミングの技術、エリックS.レイモンド、ダグマキロイを引用しています。
ディレクトリを削除するコマンドはrm
です。したがって、2つのコマンドが必要です。
rm -r ~/Desktop/foo/
mkdir ~/Desktop/foo/
コメントに示されているように、;
(= 1回失敗しても両方を行う)または&&
(= rmが失敗しない場合はmkdirのみ)でそれらを連鎖させることができます。
-r
は、ディレクトリを削除するためのものです。最初のコマンドは、ディレクトリのすべての内容も削除します。それが意図しない場合は、rmとmkdirの両方が探しているものではありません。パーミッションはchmod
とchown
です。
mkdirにこのオプションがないのはなぜですか?
あいまいさ。 mkdir
はディレクトリの作成を意味します。ディレクトリを削除して作成しません。また、rm
コマンドはコンテンツを削除するためのものであるため、rmdir
がディレクトリを削除できる必要はありません。
最もクリーンな方法でそれを行うには、これを使用します:
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>
これにより、削除しようとしているものがファイルではなくディレクトリであることを確認できます。
-d
その名前のディレクトリが既に存在するかどうかを確認します。その場合、それを削除します。
-f
この名前のファイルが存在しないことを確認してください。その場合、エラーメッセージを出力して終了します。
新しいディレクトリを作成し、エコーを成功させるか、失敗した場合はエコーに失敗します。