Timpa direktori yang ada?

11

Saya memiliki nama direktori yang footerletak di ~/Desktop. Misalkan saya ingin membuat direktori dari terminal dengan nama yang sama dan di lokasi yang sama. Ketika saya mencobanya mkdirmemberikan kesalahan:

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

Itu masuk akal, tetapi saya ingin mengganti foojika ada. Saya sudah melihat-lihat man mkdirtetapi tidak ada opsi yang melakukan itu.

Jadi bagaimana cara menimpa foodirektori?

Mengapa tidak mkdirmemiliki opsi untuk melakukan ini?

nux
sumber
Ganti fooseperti di hapus semua konten itu? mkdirmemiliki -popsi yang mengabaikan jika direktori ada.
muru
4
Jadi, Anda menginginkan perintah yang akan menghapus semua file dalam direktori ketika Anda secara tidak sengaja membuat direktori baru dengan nama yang sama? Dan Anda bertanya-tanya mengapa itu bukan pilihan? Apakah ini lelucon?
Marty Fried
downvoters hanya menjelaskan mengapa itu, saya bertanya tentang satu perintah yang menghapus direktori yang ada
nux
1
@nux bagi saya pertanyaannya tidak masuk akal ... jelaskan mengapa Anda ingin menghapus dan membuat ulang direktori. Kami memiliki perintah untuk apa pun yang perlu Anda lakukan ke direktori. mkdir tidak perlu opsi untuk menghapus / membuat ulang.
Rinzwind
1
apakah ini kejahatan di sini jika saya mengajukan pertanyaan logis !!
nux

Jawaban:

21

Jika tujuan Anda adalah menjalankan perintah satu baris yang:

  • Menghapus dan membuat ulang direktori ~/Desktop/foojika sudah ada.
  • Cukup buat direktori ~/Desktop/foojika belum ada.

Maka Anda dapat menggunakan:

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

; setara dengan baris baru, tetapi ini memungkinkan Anda menjalankan banyak perintah pada satu baris (yaitu, sebagai "perintah tunggal").

  • Jika direktori yang Anda hapus mungkin berisi file yang hanya bisa dibaca, Anda akan memerlukan -ftanda untuk menghapusnya tanpa mendorong pengguna secara interaktif. Ini tidak apa-apa, tetapi saya sangat merekomendasikan untuk berhati-hati rm -rf .... Lihat man rmdetailnya.
  • Anda membutuhkan rmperintah untuk menyelesaikan sebelum mkdirperintah dijalankan; ini adalah alasan untuk menggunakan ;bukan &. (Perintah sebelumnya &berjalan secara tidak sinkron di latar belakang.)
  • Anda memerlukan mkdirperintah untuk dijalankan ketika rmperintah berhasil; ini adalah alasan untuk menggunakan ;bukan ||.
  • Anda memerlukan mkdirperintah untuk dijalankan ketika rmperintah gagal (biasanya kegagalan berarti direktori belum ada); ini adalah alasan untuk menggunakan ;bukan &&.
  • The rmperintah mungkin gagal bahkan ketika direktori sudah ada, dalam hal ini mkdirperintah akan gagal juga, tapi pesan kesalahan akan masuk akal dan mungkin ada tidak perlu menambahkan langkah pengecekan tengah untuk fookeberadaan 's sebelum mencoba untuk menciptakannya.

Lihat 3.2.3 Daftar dari Perintah dalam Pedoman Bash Reference untuk informasi lebih lanjut dan penjelasan tentang ;, &, ||, dan &&operator.

Seperti yang disarankan muru (dan Rinzwind diuraikan ), saya sarankan Andarsync melihat apakah itu akan memenuhi kebutuhan cadangan Anda. Ada beberapa panduan tambahan yang bermanfaat di halaman dokumentasi rsync , serta panduan rsync Ubuntu ini .

mengapa mkdir tidak memiliki opsi ini?

mkdirmenciptakan direktori ("mk" adalah singkatan dari "make" ). Untuk itu juga menghapus direktori secara rekursif dan semua file di dalamnya akan buruk, karena itu akan melanggar prinsip paling tidak heran dengan cara yang mungkin akan menyebabkan hilangnya data.

rmdirbahkan tidak menghapus direktori yang memiliki file (non-direktori) di dalamnya. rmmemiliki -ropsi, yang masuk akal karena rmdiharapkan untuk menghapus file (yang tujuannya, sehingga bahaya yang melekat adalah intuitif dan pengguna biasanya tahu untuk berhati-hati ketika menjalankan rmperintah).

Eliah Kagan
sumber
+1 luar biasa. Jawaban ini berjalan di atas dan di luar dalam menjelaskan sintaks, sesuatu yang saya harap lebih mendalam di situs stackexchange. Ada banyak nugget emas dalam jawaban ini.
Govind Rai
7

Tidak, tidak ada perintah tunggal untuk melakukan apa yang Anda minta.

Mengapa?

Ini adalah filosofi Unix: Menulis program yang melakukan satu hal dan melakukannya dengan baik. Menulis program untuk bekerja bersama. 1

Dalam hal ini, perintah mkdirdan rmmelakukan apa yang Anda butuhkan, dan bekerja bersama dengan baik, karena rm -rakan menghapus direktori juga, sehingga selanjutnya mkdirakan membuat direktori.

1 The Art of Unix Programming , Eric S. Raymond, sendiri mengutip Doug McIlroy.

muru
sumber
untuk sekarang, itu jawaban yang bagus, saya akan mencarinya
nux
3

Perintah untuk menghapus direktori adalah rm. Jadi, Anda membutuhkan 2 perintah.

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

Seperti yang ditunjukkan dalam komentar, Anda dapat mengaitkannya dengan ;(= melakukan keduanya meskipun 1 gagal) atau &&(= hanya mkdir ketika rm tidak gagal).

The -radalah untuk menghapus dirs. Perintah 1 juga menghapus SEMUA isi direktori. Jika itu BUKAN niat Anda baik rm dan mkdir bukan apa yang Anda cari: izin adalah chmoddan chown.

mengapa mkdir tidak memiliki opsi ini?

Kemenduaan. mkdirberarti membuat direktori. Tidak menghapus dan membuat direktori. Dan karena rmperintahnya adalah untuk menghapus hal-hal tidak perlu untuk rmdirdapat menghapus direktori.

Rinzwind
sumber
saya tahu itu, tetapi maksud saya satu perintah, Anda dapat melihat edit saya, saya mengubahnya
nux
1st menjelaskan mengapa Anda perlu membuat ulang direktori. Tidak masuk akal bagi saya.
Rinzwind
adalah kebutuhan saya masuk akal, saya hanya ingin tahu bagaimana? masuk akal bagi saya :)
nux
@nux tidak tidak. Dan pengelola mkdir juga tidak mengerti mengapa;) Apa yang Anda inginkan tidak berguna dan tidak memiliki manfaat.
Rinzwind
ok jika Anda ingin tahu saya membuat skrip untuk membuat cadangan di direktori baru dengan nama foo yang sama dan memungkinkan menggantinya jika ada untuk mengurangi ruang
nux
1

Untuk melakukannya dengan cara terbersih saya menggunakan ini:

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 
}

Dan untuk menggunakannya:

create_clean_directory <dir_name>

Ini memastikan bahwa yang Anda coba hapus adalah direktori dan bukan file:

  1. -dPeriksa apakah direktori dengan nama itu sudah ada. jika demikian, hapus.

  2. -fPastikan tidak ada file dengan nama ini. jika demikian, cetak pesan kesalahan dan keluar.

  3. Buat direktori baru dan gema sukses, atau jika gagal, gema gagal.

Rea Haas
sumber