Yanıtlar:
*/
geçerli dizindeki tüm alt dizinlerle eşleşen bir modeldir ( *
tüm dosya ve alt dizinlerle eşleşir ; /
dizinlerle sınırlar). Benzer şekilde, / home / alice / Documents altındaki tüm alt dizinleri listelemek için şunu kullanın:ls -d /home/alice/Documents/*/
*/
Gizli klasörlerle eşleşmeyeceğini unutmayın . Bunları dahil etmek için, bunları açıkça beğendiklerinizi belirtin ls -d .*/ */
veya Bash'de seçeneği ayarlayındotglob
.
ls
şeyde her kullandığınızda bu hatayı alırsınız .
ls */
genişler ls
. Bu durumda istediğin bu olmadığından eminim.
echo
Örnek: echo */
, echo */*/
İşte ne var:
cs/ draft/ files/ hacks/ masters/ static/
cs/code/ files/images/ static/images/ static/stylesheets/
ls
Yalnızca kullanmaÖrnek: ls -d */
İşte tam olarak ne var:
cs/ files/ masters/
draft/ hacks/ static/
Veya liste olarak (ayrıntılı bilgi ile): ls -dl */
ls
ve tuşlarını kullanarakgrep
Örnek: ls -l | grep "^d"
İşte ne var:
drwxr-xr-x 24 h staff 816 Jun 8 10:55 cs
drwxr-xr-x 6 h staff 204 Jun 8 10:55 draft
drwxr-xr-x 9 h staff 306 Jun 8 10:55 files
drwxr-xr-x 2 h staff 68 Jun 9 13:19 hacks
drwxr-xr-x 6 h staff 204 Jun 8 10:55 masters
drwxr-xr-x 4 h staff 136 Jun 8 10:55 static
Örnek: for i in $(ls -d */); do echo ${i%%/}; done
İşte ne var:
cs
draft
files
hacks
masters
static
'/' Karakterini bitiş karakteri olarak kullanmak istiyorsanız, komut şöyle olacaktır: for i in $(ls -d */); do echo ${i}; done
cs/
draft/
files/
hacks/
masters/
static/
3
benim için diğerlerinden daha yavaştı. Test ettiğim dizinde: 1
.012s, 2
.016s, 3
.055s , 4
.021s.
1
benim favorim.
time
Unix işlevini kullandım. /// Katılıyorum, echo */
daha akıllı ls -d */
.
1.
seçenek, boşluk içeren klasör adlarıyla uğraşırken büyük acılara neden olur.
Kullanırım:
ls -d */ | cut -f1 -d'/'
Bu, sonda eğik çizgisi olmayan tek bir sütun oluşturur - komut dosyalarında kullanışlıdır.
Benim görüşüm.
-1
Seçeneği ls
de olduğu gibi tek sütunlu bir formatta irade çıkışı ls -1 -d */
.
-1
Yine de her giriş için bir eğik çizgi çıktığını unutmayın .
.bashrc
takma ad olarak eklediğimde nasıl eklerim '/'
?
'\/'
| sed -e 's-/$--'
Alt klasörleri olmayan tüm klasörler için :
find /home/alice/Documents -maxdepth 1 -type d
Alt klasörleri olan tüm klasörler için :
find /home/alice/Documents -type d
find /home/alice/Documents -maxdepth 1 -mindepth 1 -type d
aksi takdirde /home/alice/Documents
kendini dahil edersiniz . Dizinlere sembolik bağlantıları eklemek için-L
Bir işlem görmeyen yıldız *
kabuk tarafından bir model (topak) olarak yorumlanır.
Kabuk bunu yol adı genişletmesinde kullanır.
Ardından, kalıba uyan dosya adlarının bir listesini oluşturur.
Basit bir yıldız işareti, PWD'deki (mevcut çalışma dizini) tüm dosya adlarıyla eşleşir. Sonundaki tüm dosya adlarıyla eşleşeceği
gibi daha karmaşık bir desen . Böylece, tüm dizinler. Bu yüzden komut:*/
/
echo */
echo ./*/ ### avoid misinterpreting filenames like "-e dir"
(kabuk tarafından) echo
PWD'deki tüm dizinlere genişletilecektir .
Bunu test etmek için: mkdir
test-dir gibi bir dizin ( ) oluşturun ve cd
içine:
mkdir test-dir; cd test-dir
Bazı dizinler oluşturun:
mkdir {cs,files,masters,draft,static} # safe directories.
mkdir {*,-,--,-v\ var,-h,-n,dir\ with\ spaces} # some a bit less secure.
touch -- 'file with spaces' '-a' '-l' 'filename' # and some files:
Komut echo ./*/
, tek adlandırılmış dosyalarla bile güvenilir kalır:
./--/ ./-/ ./*/ ./cs/ ./dir with spaces/ ./draft/ ./files/ ./-h/
./masters/ ./-n/ ./static/ ./-v var/
Ancak dosya adlarındaki boşluklar okumayı biraz kafa karıştırıcı yapar.
Bunun yerine, echo
kullanırız ls
, kabuk hala dosya adları listesini genişleten şeydir. Kabuk, PWD'deki dizinlerin bir listesini almanın nedenidir. -d
Seçeneği ls
markaların yerine (varsayılan olarak sunulan gibi) her dizinin içeriğinin mevcut dizin girişinin sıralar.
ls -d */
Ancak, bu komut (bir şekilde) daha az güvenilirdir. Yukarıda listelenen tek adlandırılmış dosyalarla başarısız olur. Birkaç isim ile boğulur. Sorunlu olanları bulana kadar tek tek silmeniz gerekir.
GNU ls
"seçeneklerin sonu" ( --
) anahtarını kabul edecektir .
ls -d ./*/ ### more reliable BSD ls
ls -d -- */ ### more reliable GNU ls
Her dizini kendi satırında listelemek için (ls -1'e benzer bir sütunda) şunu kullanın:
$ printf "%s\n" */ ### Correct even with "-", spaces or newlines.
Ve daha da iyisi, izini kaldırabiliriz /
:
$ set -- */; printf "%s\n" "${@%/}" ### Correct with spaces and newlines.
Böyle bir girişim:
$ for i in $(ls -d */); do echo ${i%%/}; done
Başarısız olacak:
ls -d */
Yukarıda gösterildiği gibi bazı isimler ( ).IFS
.IFS
).Son olarak, bir fonksiyonun içindeki argüman listesinin kullanılması mevcut çalışan kabuğun argümanlar listesini etkilemez. basitçe:
$ listdirs(){ set -- */; printf "%s\n" "${@%/}"; }
$ listdirs
bu listeyi sunar:
--
-
*
cs
dir with spaces
draft
files
-h
masters
-n
static
-v var
Bu seçenekler, çeşitli garip dosya adlarıyla güvenlidir.
tree
Komut burada da oldukça yararlıdır. Varsayılan olarak, bazı ascii karakterleri dizin ağacını gösteren tüm dosyaları ve dizinleri tam bir derinlikte gösterir.
$ tree
.
├── config.dat
├── data
│ ├── data1.bin
│ ├── data2.inf
│ └── sql
| │ └── data3.sql
├── images
│ ├── background.jpg
│ ├── icon.gif
│ └── logo.jpg
├── program.exe
└── readme.txt
Ancak ascii ağacı olmadan ve geçerli dizinden tam yolla sadece dizinleri almak istersek şunları yapabilirsiniz:
$ tree -dfi
.
./data
./data/sql
./images
Argümanlar:
-d List directories only.
-f Prints the full path prefix for each file.
-i Makes tree not print the indentation lines, useful when used in conjunction with the -f option.
Ve sonra mutlak yolu istiyorsanız, geçerli dizinin tam yolunu belirleyerek başlayabilirsiniz:
$ tree -dfi "$(pwd)"
/home/alice/Documents
/home/alice/Documents/data
/home/alice/Documents/data/sql
/home/alice/Documents/images
Alt dizin sayısını sınırlamak için, alt dizinlerin maksimum düzeyini aşağıdaki gibi ayarlayabilirsiniz -L level
:
$ tree -dfi -L 1 "$(pwd)"
/home/alice/Documents
/home/alice/Documents/data
/home/alice/Documents/images
İnsan ağacı ile daha fazla tartışma görülebilir
Neden 'ls -d * /' çıktısının size aşağıdaki gibi iki eğik çizgi verdiğini merak ediyorsanız :
[prompt]$ ls -d */
app// cgi-bin// lib// pub//
Muhtemelen bir yerde kabuk veya oturum yapılandırma dosyaları -s bayrağı içeren ls sürümüne ls komutunun diğer adı. Bu bayrak her çıktı adına (bu düz bir dosya değil) ne tür bir şey olduğunu gösteren bir karakter ekler. Yani bir eğik çizgi '* /' deseniyle eşleşmektir ve diğer eğik çizgi ekteki tip göstergesidir.
Bu sorundan kurtulmak için, elbette ls için farklı bir takma ad tanımlayabilirsiniz. Ancak, takma adı geçici olarak çağırmamak için komutu ters eğik çizgi ile başlatabilirsiniz:
\ ls -d * /
Bunu sadece dosyama ekliyorum .bashrc
(sadece bir oturum için ihtiyacınız varsa / istiyorsanız komut satırına da yazabilirsiniz)
alias lsd='ls -ld */'
lsd istenen sonucu verecektir.
ls
Dizinlere sembolik bağlantılar dahil gerçek çözümBuradaki birçok cevap , gerçek alt dizin eşleşmesi için joker karakter kullanırken gerçekte kullanmaz ls
(veya yalnızca önemsiz anlamında kullanmaz) Sıralama düzeni için seçeneklerin kullanılmasına izin verdiği için ls -d
gerçek bir ls
çözüm yararlıdır ls
.
Bir çözüm kullanıldı ls
, ancak diğer bağlantılardan farklı bir şey yapıyor, çünkü dizinlere sembolik bağlantıları dışlıyor :
ls -l | grep '^d'
(büyük olasılıkla dosya adlarından geçerek sed
veya awk
ayırmak için)
Dizinlere sembolik bağlantıların dahil edilmesi gereken (muhtemelen daha yaygın) durumda -p
,ls
(işaretli olanlar da dahil olmak üzere) dizin adlarına eğik çizgi karakteri eklemesini sağlayan :
ls -1p | grep '/$'
veya sondaki eğik çizgilerden kurtulmak için:
ls -1p | grep '/$' | sed 's/\/$//'
İçin seçenekler ekleyebiliriz ls
Gerektiği gibi (uzun bir liste kullanılıyorsa, -1
artık gerekli değildir).
not: biz eğer istediğiniz eğik çizgileri, ama yapacak onları vurgulanan istemiyor grep
, biz hackishly boşaltmak hattının fiili eşleşti kısmını yaparak vurgulama kaldırabilirsiniz:
ls -1p | grep -P '(?=/$)'
Gizli dizinin listelenmesi gerekmiyorsa, şunları öneririm:
ls -l | grep "^d" | awk -F" " '{print $9}'
Ve gizli dizinlerin listelenmesi gerekiyorsa, şunu kullanın:
ls -Al | grep "^d" | awk -F" " '{print $9}'
VEYA
find -maxdepth 1 -type d | awk -F"./" '{print $2}'
awk
istiyorsanız, lütfen bu cevaba bakın
olmadan klasör listelerini göstermek /
ls -d */|sed 's|[/]||g'
ls -d1 */ | tr -d "/"
İşte ne kullanıyorum
ls -d1 /Directory/Path/*;
ls -d1 /Directory/Path/*/
Yalnızca dizinleri listelemek için :
ls -l | grep ^d
yalnızca dosyaları listelemek için :
ls -l | grep -v ^d
ya da şu şekilde yapabilirsiniz: ls -ld * /
*/
geçerli dizindeki dizinlerle eşleşen bir dosya adı eşleme desenidir.
Yalnızca dizinleri listelemek için bu işlevi beğendim:
# long list only directories
llod () {
ls -l --color=always "$@" | grep --color=never '^d'
}
Onu .bashrc'nize koyun.
Kullanım örnekleri:
llod # long listing of all directories in current directory
llod -tr # same but in chronological order oldest first
llod -d a* # limit to directories beginning with letter 'a'
llod -d .* # limit to hidden directories
NOT: -i
seçeneği kullanırsanız kırılır . İşte bunun için bir düzeltme:
# long list only directories
llod () {
ls -l --color=always "$@" | egrep --color=never '^d|^[[:digit:]]+ d'
}
Bilginize, tüm dosyaları çok satırlı ls -1
yazdırmak istiyorsanız, her dosyayı ayrı bir satıra yazdıracak bir dosya yapabilirsiniz. dosya1 dosya2 dosya3
Kısmen ile çözdüm:
cd "/path/to/pricipal/folder"
for i in $(ls -d .*/); do sudo ln -s "$PWD"/${i%%/} /home/inukaze/${i%%/}; done
ln: «/home/inukaze/./.»: can't overwrite a directory
ln: «/home/inukaze/../..»: can't overwrite a directory
ln: accesing to «/home/inukaze/.config»: too much symbolics links levels
ln: accesing to «/home/inukaze/.disruptive»: too much symbolics links levels
ln: accesing to «/home/inukaze/innovations»: too much symbolics links levels
ln: accesing to «/home/inukaze/sarl»: too much symbolics links levels
ln: accesing to «/home/inukaze/.e_old»: too much symbolics links levels
ln: accesing to «/home/inukaze/.gnome2_private»: too much symbolics links levels
ln: accesing to «/home/inukaze/.gvfs»: too much symbolics links levels
ln: accesing to «/home/inukaze/.kde»: too much symbolics links levels
ln: accesing to «/home/inukaze/.local»: too much symbolics links levels
ln: accesing to «/home/inukaze/.xVideoServiceThief»: too much symbolics links levels
Bu bana, belediye başkanı kısma :)
Tam bir daire yapmak, her klasörün yolunu almak için ekleyerek, Albert'ın yanı sıra Gordans'ın yanı sıra oldukça yararlı olması gereken bir kombinasyonunu kullanın.
for i in $(ls -d /pathto/parent/folder/*/); do echo ${i%%/}; done
Çıktı:
/pathto/parent/folder/childfolder1/
/pathto/parent/folder/childfolder2/
/pathto/parent/folder/childfolder3/
/pathto/parent/folder/childfolder4/
/pathto/parent/folder/childfolder5/
/pathto/parent/folder/childfolder6/
/pathto/parent/folder/childfolder7/
/pathto/parent/folder/childfolder8/
Perl Kullanımı:
ls | perl -nle 'print if -d;'
İşte sadece dizin adlarını listelemek için kullandığım şey:
ls -1d /some/folder/*/ | awk -F "/" "{print \$(NF-1)}"
Burada dizin adlarını yalnızca ayrı satırlarda çıkaran bir ağaç varyasyonu var, evet çirkin ama hey, işe yarıyor.
tree -d | grep -E '^[├|└]' | cut -d ' ' -f2
veya awk ile
tree -d | grep -E '^[├|└]' | awk '{print $2}'
Ancak bu muhtemelen daha iyidir ve /
sonraki dizin adını korur .
ls -l | grep "^d" | awk '{print $9}'
file *|grep directory
O / P (Makinemde) -
[root@rhel6 ~]# file *|grep directory
mongo-example-master: directory
nostarch: directory
scriptzz: directory
splunk: directory
testdir: directory
Yukarıdaki çıktı kesim kullanılarak daha da geliştirilebilir.
file *|grep directory|cut -d':' -f1
mongo-example-master
nostarch
scriptzz
splunk
testdir
* could be replaced with any path that's permitted
file - determine file type
grep - searches for string named directory
-d - to specify a field delimiter
-f1 - denotes field 1
Sadece dizinleri listelemek için şimdiye kadarki en kısa komut (aslında bir hack). İlgilenilen dizinin mutlak yolunu veya göreceli yolunu yazın ve ilgilenilen dizini girmek için enter tuşuna basın. Şimdi sekme tuşunu yazın cd
ve basın . Yalnızca dizinler gösterilir.
user@ubuntu:~/Desktop$cd <tab key>
Yukarıdaki komut artık yalnızca Masaüstü'ndeki klasörleri görüntülemelidir . Gerçekten en kısa.
-d
.