Soru Bir kabuk dosyasında bir dizinin var olup olmadığını kontrol edin


Bir komut dosyası içinde bir dizinin var olup olmadığını kontrol etmek için hangi komut kullanılabilir?


2999
2017-09-12 20:06


Menşei




Cevaplar:


Bir kabuk komut dosyasında bir dizinin var olup olmadığını kontrol etmek için aşağıdakileri kullanabilirsiniz:

if [ -d "$DIRECTORY" ]; then
  # Control will enter here if $DIRECTORY exists.
fi

Veya bir dizinin mevcut olup olmadığını kontrol etmek için:

if [ ! -d "$DIRECTORY" ]; then
  # Control will enter here if $DIRECTORY doesn't exist.
fi

Ancak, Jon Ericson bir dizine sembolik bir bağlantının da bu denetimi geçeceğini hesaba katmazsanız, sonraki komutların amaçlandığı şekilde çalışmayabilir. Örneğin. bunu çalıştırıyor:

ln -s "$ACTUAL_DIR" "$SYMLINK"
if [ -d "$SYMLINK" ]; then 
  rmdir "$SYMLINK" 
fi

Hata iletisini üretecek:

rmdir: failed to remove `symlink': Not a directory

Böylece sembolik bağlar, sonraki komutlar dizinleri beklerse, farklı şekilde ele alınabilir:

if [ -d "$LINK_OR_DIR" ]; then 
  if [ -L "$LINK_OR_DIR" ]; then
    # It is a symlink!
    # Symbolic link specific commands go here.
    rm "$LINK_OR_DIR"
  else
    # It's a directory!
    # Directory command goes here.
    rmdir "$LINK_OR_DIR"
  fi
fi

Değişkenleri sarmak için kullanılan çift tırnakların özel not alın, bunun nedeni 8jean tarafından açıklanmıştır. başka bir cevapta.

Değişkenler boşluk veya başka sıradışı karakterler içeriyorsa, büyük olasılıkla komut dosyasının başarısız olmasına neden olur.


4144
2017-09-12 20:07



GNU araçları ile güvenli oynamak istiyorsanız, -- şiddetle tavsiye edilir (seçenek işareti sonu). Aksi takdirde, değişkeniniz bir seçenek gibi görünen bir şey içeriyorsa, betik boşluklarda olduğu gibi başarısız olur. - Marc Mutz - mmutz
Bash, ksh, vb. Modern versiyonları için [...] - fpmurphy1
Akılda tutulması gereken bir şey: [ ! -d "$DIRECTORY" ] eğer doğruysa $DIRECTORYmevcut değil veya yapar var ama bir dizin değil. Gibi bir şey düşünün if [ ! -d "$DIRECTORY" ] ; then mkdir "$DIRECTORY" ; fi; bu eğer başarısız olur "$DIRECTORY" bir dosyadır. (Tabi ki kontrol etmeli mkdir yine de başarılı oldu; Başarısız olmasının birkaç nedeni vardır.) - Keith Thompson
Çekin yapıldığı anda durumun diğer süreçler nedeniyle zaten değişmiş olabileceği belirtilmelidir. Çoğu durumda, sadece dizini oluşturmak veya kullanmak ve bir hata durumunda tepki vermek daha iyidir. - Alfe
Her iki dizin için de test yapmak yerine-d) ve sembolik bağlantı (-L), sadece değişkene eğik çizgi eklemek daha kolaydır if [ -d "${THING:+$THING/}" ]. Bir dizin ekstra eğik çizgi olmaz. Bir dosya yanlış olarak değerlendirilecektir. Boş boş kalacaktır, bu yüzden yanlış. Ve bir bağlantı adresi hedefine çözülecektir. Tabii ki, hedefinize bağlı. Eğer istersen gitmek İşte bu iyi. Eğer istersen silinDaha sonra bu cevaptaki kod daha iyidir. - ghoti


Bunlara başvuruda bulunurken, değişkenleri her zaman çift tırnak içine almayı unutmayın. bir bash betiği. Çocuklar bu günlerde, kendi dizin adlarında boşluk ve başka komik karakterler barındırabilecekleri fikriyle büyüyorlar. (Uzaylar! Günlerimde, hiç fantezi alanımız olmadı!))

Bir gün, bu çocuklardan biri senaryonunla $DIRECTORY ayarlanır "My M0viez" ve senaryonun patlayacak. Bunu istemiyorsun. Öyleyse bunu kullan.

if [ -d "$DIRECTORY" ]; then
    # Will enter here if $DIRECTORY exists, even if it contains spaces
fi

454
2017-09-15 22:00



Çift tırnak kullanmanın bir başka nedeni, $ DIRECTORY'un bir sebepten ötürü ayarlanmamış olmasıdır. - Jon Ericson♦
"Değişkenleri her zaman bir bash komut dosyasında çift tırnak içine alır." Bash için, [[...]] kullanırken teknik olarak gerekli değildir; görmek tldp.org/LDP/abs/html/testconstructs.html#DBLBRACKETS (not: kelime bölme yok): "[veya]] arasında dosya adı genişletme veya kelime bölme işlemi gerçekleşmez, ancak parametre genişletme ve komut değiştirme işlemi vardır." - michael
Unix / Linux'taki dizinler herhangi bir beyaz boşluğa sahip olmamalı ve daha sonra betikler buna uyarlanmamalıdır. Windows, Windows komut dosyalarının tüm sonuçlarıyla birlikte bunu destekleyebilecek kadar kötü, ancak lütfen gereksiz olanları tanıtmaya gerek yok. - tvCa
@tvCa Kullanıcıların, genellikle geliştiricilerin işlerini kolaylaştırmak zorunda kalmaları yerine, dizin adlarında daha fazla esnekliğe izin vermeyi tercih ettiklerini görüyorum. (Aslında, uzun dosya isimleriyle uğraşırken, boşlukları olmayanların, sanki geçmişte geçmişte yazdıklarım, komut dosyalarında ve programlarda yer alan boşlukları hesaba katmamaktan dolayı acı çektiğim halde, sanki sarılıyorum. - JAB
Ha. Uzaylar, genellikle glifleri olmayan karakterlerdir. Neyse, onları ters eğik çizgi ile kaçabilirsiniz. - uchuugaka


Not -d Test bazı şaşırtıcı sonuçlar doğurabilir:

$ ln -s tmp/ t
$ if [ -d t ]; then rmdir t; fi
rmdir: directory "t": Path component not a directory

Dosya altında: "Bir dizin ne zaman bir dizin değil?" Cevap: "Bir dizine bir sembolik bağ olduğunda." Biraz daha kapsamlı bir test:

if [ -d t ]; then 
   if [ -L t ]; then 
      rm t
   else 
      rmdir t
   fi
fi

Daha fazla bilgiyi Bash kılavuzunda bulabilirsiniz. Bash koşullu ifadeleri ve [ yerleşik komut ve [[ bileşik commmand.


204
2017-09-12 20:26



veya yalnızca dizinlerde çalışmak gerektiğinin varsayılması (ve bağlantılar göz ardı edilebilir) => if [ -d tmpdir -a ! -L tmpdir ]; then echo "is directory"; rmdir tmpdir; fi ... veya hem bağlantılar hem de dirs üzerinde çalışan bir komut için: rm -r tmpdir - michael


Buluyorum çift ​​ayraç versiyonu test Yazma mantığı testlerini daha doğal hale getirir:

if [[ -d "${DIRECTORY}" && ! -L "${DIRECTORY}" ]] ; then
    echo "It's a bona-fide directory"
fi

198
2017-09-12 21:33



için if [[ -d "$TARFILE" ]] Alıyorum [[: bulunamadı - TheVillageIdiot
ditto [[: bulunamadı - Hedgehog
@ TheVillageIdiot ve @Hedgehog, bash kabuk kullanıyor musunuz? Çift dirsek evrensel olarak desteklenmez. İşte bu noktada bir cevap: stackoverflow.com/questions/669452/... - yukondude
Ve varsayılan derleme seçenekleri ile Busybox kül içinde [[ ]] desteklenir, ancak aslında herhangi bir farklı işlevsellik sağlamaz [ ]. Taşınabilirlik bir endişe varsa, ile sopa [ ] ve gerekli geçici çözümleri kullanın. - dubiousjim
... eğer bir kabuk betiğinde bash yapıları kullanılıyorsa, betiğin ilk satırı şöyle olmalıdır: #! / bin / bash (ve #! / bin / sh, ksh, vs. değil) - michael


Daha kısa biçim:

[ -d "$DIR" ] && echo "Yes"

125
2017-09-12 21:08



Bu böyle çalışır: if $dir is a dir, then echo "yes"? Biraz açıklama yardımcı olacaktır :) - Martijn
cmd && other için yaygın bir shorthand if cmd; then other; fi - Bu, Boole mantığını destekleyen çoğu programlama diliyle çalışır ve şu şekilde bilinir: kısa devre değerlendirmesi. - tripleee
Davranış aynı değil set -e (Bu bir kabuk programlama en iyi uygulaması). - dolmen


Bir dizinin var olup olmadığını kontrol etmek için aşağıdaki gibi basit bir yapı kullanabilirsiniz:

if [ -d directory/path to a directory ] ; then
#Things to do

else #if needed #also: elif [new condition] 
# things to do
fi

Bunu da negatif yapabilirsin

if [ ! -d directory/path to a directory ] ; then
# things to do when not an existing directory

Not: Dikkatli olun, hem açıklık hem de kapanma braketlerinin her iki tarafında boş alanlar bırakın.

Aynı sözdizimi ile şunları kullanabilirsiniz:

-e: any kind of archive 

-f: file 

-h: symbolic link 

-r: readable file 

-w: writable file 

-x: executable file 

-s: file size greater than zero 

119
2018-04-08 02:50





if [ -d "$DIRECTORY" ]; then  
    # Here if $DIRECTORY exists  
fi

94
2018-04-15 08:07





Kullanabilirsiniz test -d (görmek man test).

-d file       Dosya varsa ve bir dizin ise doğrudur.

Örneğin:

test -d "/etc" && echo Exists || echo Does not exist

Not: test komut koşullu ifade ile aynıdır [ (görmek: man [), bu yüzden kabuk betikleri arasında taşınabilir.

[ - Bu bir eşanlamlı test yerleşik, ama son argüman, bir edebi olmalı ], açıklığı eşleştirmek için [.

Olası seçenekler veya daha fazla yardım için şunları kontrol edin:

  • help [
  • help test
  • man test veya man [

74
2017-09-12 21:25





Ya da tamamen işe yaramaz bir şey için:

[ -d . ] || echo "No"

55
2017-08-17 14:02



Asla "Hayır" yazmaz. Başka bir iş parçacığı veya başka yollarla silinmediği sürece, geçerli dizin her zaman var olur. - Jahid
Mükemmel örnek :), "benzersiz" in, kabul edilen cevaba kıyasla bazı cevaplar olduğu düşünülürse - Sergey Sargsyan
Neden bu kadar defa defa çekildi? Bu soruya cevap vermiyor. - codeforester