a*Ve *a*sözdizimi vermeyerek, kabuk tarafından uygulanmaktadır lskomutu.
Ne zaman yaz
ls a*
Kabuk isteminde, kabuk a*, geçerli dizindeki adları ile başlayan tüm dosyaların listesini genişletir a. Örneğin a*, diziye genişleyebilir a1 a2 a3ve bunları argüman olarak iletebilir ls. lsKomut kendisi asla görür *karakteri; Sadece üç argüman görür a1, a2ve a3.
Joker karakter genişletme amaçları için "dosyalar", geçerli dizindeki tüm varlıkları ifade eder. Örneğin, a1normal bir dosya a2olabilir, bir dizin a3olabilir ve bir işaret olabilir. Hepsinde rehber girişi var ve kabuğun joker karakter genişletmesi bu girişlerin ne tür bir varlıktan bahsettiği ile ilgilenmiyor.
Pratikte rastlayacağınız tüm kabukları (bash, sh, ksh, zsh, csh, tcsh, ...) joker karakterler uygular. Ayrıntılar değişebilir, ancak *sıfır veya daha fazla karakter ?eşleştirmenin ve herhangi bir tek karakteri eşleştirmenin temel sözdizimi makul şekilde tutarlıdır.
Özellikle bash için, bu bash el kitabının "Dosya adı genişletme" bölümünde belgelenmiştir; çalıştırın info bashve "Dosya adı genişletme" ifadesini arayın veya buraya bakın .
Bunun kabuk tarafından ve bireysel komutlarla yapılmaması bazı ilginç (ve bazen şaşırtıcı) sonuçlara yol açar. Bu konuda en iyi şey, joker karakter işlemenin (hemen hemen) tüm komutlar için tutarlı olmasıdır ; eğer kabuk bunu yapmazsa, kaçınılmaz olarak bazı komutlar rahatsız olmaz ve diğerleri yazarın "daha iyi" olduğunu düşündüğü ustalıkla farklı şekillerde yapardı. (Windows komut kabuğunun bu sorunu yaşadığını düşünüyorum, ancak daha fazla yorum yapacak kadar aşina değilim.)
Öte yandan, birden fazla dosyayı yeniden adlandırmak için bir komut yazmak zor. Eğer yazarsan:
mv *.log *.log.bak
*.log.bakGeçerli dizinde zaten mevcut olan dosyalara göre genişletildiğinden , muhtemelen başarısız olacaktır . Böyle bir şey yapan komutlar var, ancak dosyaların nasıl yeniden adlandırılacağını belirlemek için kendi sözdizimlerini kullanmak zorundalar. Bazı komutlar (örneğin find) kendi joker karakter genişletmelerini yapabilir; kabuğun genişlemesini bastırmak için argümanlardan alıntı yapmalısınız
find . -name '*.txt' -print
Kabuğun joker genişlemesi, tamamen komut satırı argümanının sözdizimine ve mevcut dosya dizisine dayanır. O olamaz komutu anlamı etkilenebilir. Örneğin, tüm .logdosyaları ana dizine taşımak istiyorsanız, şunu yazabilirsiniz:
mv *.log ..
Eğer unutursanız ..:
mv *.log
ve .logşu anki dizinde tam olarak iki dosya var, genişleyecektir:
mv one.log two.log
Bu yeniden adlandırır one.logve clobber two.log.
EDIT : 52 yükseltme, bir kabul ve Guru rozeti sonrasında, belki de başlıktaki soruya cevap vermeliyim.
-dYa --directoryseçeneği lsyalnızca dizinleri listelemek için bunu söylemez. Dizinleri içeriklerini değil, kendileri gibi listelemelerini söyler. Dizine bir argüman adı verirseniz ls, varsayılan olarak dizinin içeriğini listeler , çünkü genellikle ilgilendiğiniz şey budur. -dSeçenek, sadece dizinin kendisini listelemesini söyler. Bu, joker karakterlerle birleştirildiğinde özellikle yararlı olabilir. Eğer yazarsanız:
ls -l a*
lsSize her birinin uzun bir liste verecek dosyanın adı başlar ile a, ve içerikleri adı başlar her dizinin a. Dosyaların ve dizinlerin listesini görmek istiyorsanız, her biri için bir satır kullanın:
ls -ld a*
hangi eşdeğerdir:
ls -l -d a*
Unutmayın ki lskomut asla *karakteri görmez .
Bunun belgelendirildiği yere gelince, Unix benzeri herhangi bir sistem hakkında komutun man lsbelgelerini size gösterecektir ls. Çoğu Linux tabanlı sistemlerde, lskomut GNU coreutils paketinin bir parçasıdır; Eğer varsa infokomutu ya info lsya info coreutils lssize daha fazla kesin ve kapsamlı bir dokümantasyon vermelidir. MacOS gibi diğer sistemler lskomutun farklı sürümlerini kullanabilir ve bu infokomutu kullanmayabilir; bu sistemler için kullanın man ls. Ve ls --helpbir gösterecektir nispeten kısa bir kullanım iletisi (sistemimde 117 hat) eğer sen GNU coreutils uygulamasını kullanıyoruz.
Ve evet, uzmanların bile dokümantasyona şimdi ve o zaman danışması gerekiyor. Ayrıca bu klasik şakayı görün .