foo
にディレクトリ名があります~/Desktop
。ターミナルから同じ名前で同じ場所にディレクトリを作成したいとします。試してみるとmkdir
エラーが発生しました:
mkdir: cannot create directory `/home/nux/Desktop/foo': File exists
それは理にかなっていますが、存在する場合は置き換えたいですfoo
。man 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
この例では、 コマンドmkdir
とrm
コマンドが必要な処理を実行し、適切に連携します。 は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>
これにより、削除しようとしているのがファイルではなくディレクトリであることが確認されます。
-d
その名前のディレクトリがすでに存在するかどうかを確認します。存在する場合は削除します。-f
この名前のファイルが存在しないことを確認します。存在する場合は、エラー メッセージを出力して終了します。新しいディレクトリを作成し、成功をエコーします。失敗した場合は、失敗をエコーします。