Bagaimana cara mkdir hanya jika dir belum ada?

1987

Saya menulis skrip shell untuk dijalankan di bawah KornShell (ksh) di AIX. Saya ingin menggunakan mkdirperintah untuk membuat direktori. Tetapi direktori mungkin sudah ada, dalam hal ini saya tidak ingin melakukan apa pun. Jadi saya ingin menguji apakah direktori tersebut tidak ada, atau menekan kesalahan "File exist" yang muncul mkdirketika mencoba membuat direktori yang sudah ada.

Adakah pemikiran tentang cara terbaik untuk melakukan ini?

Spike Williams
sumber

Jawaban:

3295

Coba mkdir -p:

mkdir -p foo

Perhatikan bahwa ini juga akan membuat direktori perantara yang tidak ada; contohnya,

mkdir -p foo/bar/baz

akan membuat direktori foo,, foo/bardan foo/bar/bazjika tidak ada.

Beberapa implementasi seperti GNU mkdirtermasuk mkdir --parentssebagai alias yang lebih mudah dibaca, tetapi ini tidak ditentukan dalam POSIX / Spesifikasi Single Unix dan tidak tersedia pada banyak platform umum seperti macOS, berbagai BSD, dan berbagai Unix komersial, sehingga harus dihindari.

Jika Anda ingin kesalahan ketika direktori induk tidak ada, dan ingin membuat direktori jika tidak ada, maka Anda dapat testuntuk keberadaan direktori terlebih dahulu:

[ -d foo ] || mkdir foo
Brian Campbell
sumber
11
contoh singkat yang Anda gunakan adalah apa yang seharusnya tidak Anda lakukan. Ini membalik logika untuk menghemat ruang pengkodean tetapi harus digunakan! dan && dan lebih masuk akal bagi mereka yang membacanya.
Mike Q
16
@AndreasLarsen Pertanyaan ini tentang mkdirsistem seperti Unix, bukan pada Windows. -pdiperlukan untuk kepatuhan Spesifikasi POSIX / Single Unix, sehingga segala sesuatu yang bermaksud untuk memenuhi spesifikasi tersebut akan mendukung -p. Windows sama sekali berbeda, kecuali Anda menggunakan lapisan emulasi POSIX seperti Cygwin atau MSYS.
Brian Campbell
22
Saya menemukan sesuatu yang menarik hari ini dengan mkdir -p, Anda dapat menggunakan tanda kurung! {}untuk membuat pohon direktori "kompleks" dalam sebuah perintah. Lihat di sini: technosophos.com/2010/04/15/…
herve
12
@MikeQ Saya lebih suka ||daripada &&karena kemudian seluruh baris memiliki status keluar yang tepat. Penting jika shell Anda berjalan dengan errexitatau jika baris itu adalah yang terakhir dalam suatu fungsi, switch-case, apa pun.
rudimeier
9
@herve Itu tidak ada hubungannya dengan mkdir; shell memperluas ekspresi seperti itu ke daftar argumen diskrit yang diteruskan ke mkdir.
chepner
176

Ini seharusnya bekerja:

$ mkdir -p dir

atau:

if [[ ! -e $dir ]]; then
    mkdir $dir
elif [[ ! -d $dir ]]; then
    echo "$dir already exists but is not a directory" 1>&2
fi

yang akan membuat direktori jika tidak ada, tetapi memperingatkan Anda jika nama direktori yang Anda coba buat sudah digunakan oleh sesuatu selain direktori.

Alnitak
sumber
Saya tidak berpikir ada operator -d di korn, melainkan -e digunakan untuk kedua file / direktori dan hanya memeriksa keberadaan. Juga, mereka semua mengembalikan 0 saat sukses, jadi! berlebihan. Koreksi saya jika saya salah.
alkar
1
salah dalam kedua hal, AFAIK. tes kembali benar pada kesuksesan, dan -d ada juga (setidaknya pada MacOS X)
Alnitak
5
mungkin perlu disebutkan bahwa ini bukan thread-safe. antara waktu Anda memeriksa apakah direktori ada dan waktu Anda mencoba menulis, hal-hal mungkin berubah.
Justin L.
89

Gunakan flag -p.

man mkdir
mkdir -p foo
jimmyorr
sumber
73

Mendefinisikan pohon direktori kompleks dengan satu perintah

mkdir -p project/{lib/ext,bin,src,doc/{html,info,pdf},demo/stat/a}
Oleg
sumber
tidak ada kesalahan jika ada, buat direktori induk sesuai kebutuhan
Fedir RYKHTIK
18
Perlu diingat bahwa ini bukan fitur mkdiritu sendiri, tetapi shell yang mengeksekusi perintah. Ini disebut ekspansi brace - AFAIK, hanya Bash, ksh, zsh, dan shell C yang mendukungnya.
Daniel Kamil Kozar
3
jika Anda memiliki ruang di sekitar koma, Anda dapat (akan) mendapatkan hasil yang tidak terduga. Waspadalah.
Atlas7
1
@ Atlas7 menyatakan, Anda harus melarikan diri karakter yang biasanya merupakan bagian dari regex. (Yaitu alih-alih menggunakan folder nameAnda harus menggunakan folder\ name)
John Hamilton
1
Ini bukan jawaban; ini adalah topik terpisah yang akan lebih sesuai sebagai komentar.
Chris Halaman
40

Jika Anda tidak ingin menampilkan pesan kesalahan:

[ -d newdir ] || mkdir newdir

Jika Anda ingin menampilkan pesan kesalahan Anda sendiri:

[ -d newdir ] && echo "Directory Exists" || mkdir newdir
Jahid
sumber
20

Yang lama mencoba dan benar

mkdir /tmp/qq >/dev/null 2>&1

akan melakukan apa yang Anda inginkan tanpa syarat balapan yang dimiliki oleh banyak solusi lainnya.

Terkadang solusi yang paling sederhana (dan paling jelek) adalah yang terbaik.

paxdiablo
sumber
5
Ini akan gagal jika "tmp" tidak ada. juga tidak memberi Anda konfirmasi.
Mike Q
15

mkdir fooberfungsi bahkan jika direktori ada. Untuk membuatnya berfungsi hanya jika direktori bernama "foo" tidak ada, coba gunakan -pbendera.

Contoh: -

mkdir -p foo

Ini akan membuat direktori bernama "foo" hanya jika tidak ada. :)

Atul Ranjan
sumber
2
Seperti yang disebutkan oleh @BrianCampbell, ini juga akan membuat direktori lain di path. Ini bisa berbahaya jika misalnya volume menjadi tidak terpasang, karena dapat membuat direktori di titik pemasangan.
uliwitness
11
directory_name = "foo"

if [ -d $directory_name ]
then
    echo "Directory already exists"
else
    mkdir $directory_name
fi
Visuwa Bharathi K
sumber
10

Atau jika Anda ingin memeriksa keberadaannya terlebih dahulu:

if [[ ! -e /path/to/newdir ]]; then
            mkdir /path/to/newdir
fi

-e adalah tes yang ada untuk cangkang korn.

Anda juga dapat mencoba googling manual shell korn.

alkar
sumber
10

mkdir tidak mendukung -p beralih lagi pada sistem Windows 8+.

Anda bisa menggunakan ini:

IF NOT EXIST dir_name MKDIR dir_name
Karanvir Kang
sumber
10
OP adalah tentang AIX kornshell ... tidak ada hubungannya dengan Windows, bukan?
J. Chomel
9

Mengacu pada halaman manual man mkdiruntuk opsi -p

   -p, --parents
          no error if existing, make parent directories as needed

yang akan membuat semua direktori di jalur yang diberikan, jika ada tidak ada kesalahan jika tidak membuat semua direktori dari kiri ke kanan di jalur yang diberikan. Coba perintah di bawah ini. direktori newdirdan anotherdirtidak ada sebelum mengeluarkan perintah ini

Penggunaan yang Benar

mkdir -p /tmp/newdir/anotherdir

Setelah menjalankan perintah, Anda dapat melihat newdirdan anotherdirmembuat di bawah / tmp. Anda dapat mengeluarkan perintah ini sebanyak yang Anda inginkan, perintah itu selalu ada exit(0). Karena alasan ini sebagian besar orang menggunakan perintah ini dalam skrip shell sebelum menggunakan jalur yang sebenarnya.

vkrams
sumber
8

Anda dapat menggunakan apakah loop untuk memeriksa apakah direktori ada atau tidak, jika tidak keluar daripada membuat direktori.

1) dir = / home / dir_name

if [ ! -d $dir ]
then
     mkdir $dir
else
     echo "Directory exists"  
fi

2) Anda dapat direktori menggunakan mkdir dengan opsi -p untuk membuat direktori. Itu akan memeriksa apakah direktori tidak tersedia itu akan.

mkdir -p $dir

mkdir -p juga memungkinkan untuk membuat struktur pohon direktori. Jika Anda ingin membuat direktori induk dan anak menggunakan perintah yang sama, dapat memilih mkdir -p

mkdir -p /home/parent_dir /home/parent_dir/child1 /home/parent_dir/child2
AbhinavVaidya8
sumber
Apakah ada keuntungan menggunakan loop jika !? mengapa seseorang memilih opsi overp?
pedram bashiri
1
Saya telah membagikan kepada Anda cara membuat folder ketika folder tidak ada. Tergantung pada persyaratan yang satu. Jika Anda memiliki kasus penggunaan di mana Anda perlu memeriksa apakah folder tidak ada dan Anda ingin melacaknya sehingga Anda bisa pergi dengan solusi 1. Jika tidak masalah, Anda bisa pergi dengan solusi 2, itu akan membuat folder jika tidak ada.
AbhinavVaidya8
Saya tidak melihat lingkaran.
Amit Naidu
3

Ini adalah fungsi sederhana (bash shell) yang memungkinkan Anda membuat direktori jika tidak ada.

#----------------------------------
# Create a directory if it doesn't exist
#------------------------------------
createDirectory() {
    if [ ! -d $1 ]
        then
        mkdir -p $1
    fi
}

Anda dapat memanggil fungsi di atas sebagai:

createDirectory / tmp / fooDir / BarDir

Di atas membuat fooDir dan BarDir jika tidak ada. Perhatikan opsi "-p" dalam perintah mkdir yang membuat direktori secara rekursif. Semoga ini membantu.

Balaji Boggaram Ramanarayan
sumber
2
mkdir -p sam
  • mkdir = Buat Direktori
  • -p = --orang tua
  • (tidak ada kesalahan jika ada, buat direktori induk sesuai kebutuhan)
Paritosh Yadav
sumber
2
if [ !-d $dirName ];then
     if ! mkdir $dirName; then  # Shorter version. Shell will complain if you put braces here though
     echo "Can't make dir: $dirName"
     fi
fi
Alex Zubkov
sumber