Yanıtlar:
Sonunda yalnızca dizinlerle eşleşecek bir eğik çizgi belirleyebilirsiniz:
for d in */ ; do
echo "$d"
done
[[ -L $d ]]$ d'nin sembolik bir bağlantı olup olmadığını test edebilirsiniz .
set -Pyalnızca dizini değiştiren komutları etkiler. sprunge.us/TNac
[[ -L "$f" ]]ile bu durumda sembolik bağları dışlamayacak */, takip eden eğik çizgiyi kesmek zorunda kalacaksınız [[ -L "${f%/}" ]]( takip eden eğik çizgiyle bağlantı testi için bakın )
İle test edebilirsiniz -d:
for f in *; do
if [ -d "$f" ]; then
# $f is a directory
fi
done
if [[ -d "$f" && ! -L "$f" ]]sembolik
if [[ "$f" = "*" ]]; then continue; fi
Choroba'nın çözümünün, şık olmasına rağmen, mevcut dizinde hiçbir dizin bulunmuyorsa beklenmeyen davranışlar ortaya çıkarabileceğini unutmayın. Bu durumda, atlama yerine fordöngü, bash tam olarak nerede bir kez döngü çalışır deşittir */:
#!/usr/bin/env bash
for d in */; do
# Will print */ if no directories are available
echo $d
done
Bu davaya karşı korunmak için aşağıdakileri kullanmanızı öneririm:
#!/usr/bin/env bash
for f in *; do
if [ -d ${f} ]; then
# Will not run if no directories are available
echo $f
fi
done
Bu kod geçerli dizindeki tüm dosyalar arasında dolaşır f, bir dizin olup olmadığını kontrol eder , sonra fkoşul doğru dönerse eko olur. Eğer feşittir */, echo $fyürütülmez.
shopt -s nullglob.
Yalnızca dizinlerin kullandığından daha belirli dosyalar seçmeniz gerekiyorsa findve bunu iletin while read:
shopt -s dotglob
find * -prune -type d | while IFS= read -r d; do
echo "$d"
done
shopt -u dotglobGizli dizinleri hariç tutmak için kullanın (veya setopt dotglob/ unsetopt dotglobin zsh).
IFS=$IFSörneğin birini içeren dosya adlarını bölmekten kaçınmak için:'a b'
bkz AsymLabs cevap fazlası için aşağıdaki findseçeneklerden
edit:
while döngüsünden bir çıkış değeri oluşturmanız gerekirse, ekstra alt kabuğu bu numaraya çevirebilirsiniz:
while IFS= read -r d; do
if [ "$d" == "something" ]; then exit 1; fi
done < <(find * -prune -type d)
Bunun için saf bash kullanabilirsiniz, ancak bulmak kullanmak daha iyidir:
find . -maxdepth 1 -type d -exec echo {} \;
(ayrıca gizli dizinleri içerecek şekilde bulun)
shopt -s dotglobiçin kullanabilirsiniz bash. Seninkiler de içerecek .. Ayrıca -maxdepthstandart bir seçenek olmadığını unutmayın ( -pruneis).
dotglobSeçenek ilginç ama dotglobsadece kullanımı için geçerlidir *. find .her zaman gizli dizinleri (ve mevcut dizini de
Bu, kök dizini hariç, mevcut çalışma dizini içerisinde hem görünür hem de gizli dizinleri bulmak için yapılır:
sadece dizinler arasında dolaşmak için:
find -path './*' -prune -type d
sonuçta sembolik bağlantılar eklemek için:
find -L -path './*' -prune -type d
Her dizine bir şey yapmak için (sembolik bağlantılar hariç):
find -path './*' -prune -type d -print0 | xargs -0 <cmds>
Gizli dizinleri hariç tutmak için:
find -path './[^.]*' -prune -type d
döndürülen değerler üzerinde çok sayıda komut çalıştırmak için (çok tartışmalı bir örnek):
find -path './[^.]*' -prune -type d -print0 | xargs -0 -I '{}' sh -c \
"printf 'first: %-40s' '{}'; printf 'second: %s\n' '{}'"
'sh -c' yerine 'bash -c' vb.
... -print0 | xargs -0 ...Tam adların ne olduğunu bilmiyorsanız , kullanmanız daha iyi olur .
find * | while read file; do ...
Tek bir satırda gizli dizinler (nokta ile başlayan) ve tüm komutlar dahil olmak üzere tüm dizinler arasında geçiş yapabilirsiniz:
for file in */ .*/ ; do echo "$file is a directory"; done
Sembolik linkleri hariç tutmak istiyorsanız:
for file in *; do
if [[ -d "$file" && ! -L "$file" ]]; then
echo "$file is a directory";
fi;
done
not: listeyi kullanmak */ .*/bash olarak çalışır, fakat aynı zamanda klasörleri de gösterir .ve ..zsh sırasında bunları göstermez, fakat klasörde gizli bir dosya yoksa, bir hata atar.
Gizli dizinleri içerecek ve ../ hariç tutacak daha temiz bir sürüm dotglob seçeneğiyle olacak:
shopt -s dotglob
for file in */ ; do echo "$file is a directory"; done
(veya setopt dotglobzsh cinsinden)
ile dotglob unset yapabilirsiniz
shopt -u dotglob
Bu, listedeki her dizindeki tam yolu içerir:
for i in $(find $PWD -maxdepth 1 -type d); do echo $i; done
Kullanım findile -execdizinlere döngü ve bir çağrı işlevi exec seçeneğinde:
dosomething () {
echo "doing something with $1"
}
export -f dosomething
find -path './*' -prune -type d -exec bash -c 'dosomething "$0"' {} \;
Gizli dizinleri dahil etmek / hariç tutmak için shopt -s dotglobveya kullanınshopt -u dotglob
ls -l | grep ^d
veya:
ll | grep ^d
Takma ad olarak ayarlayabilirsiniz
lstemelli cevaptan biraz farklı olan soruyu yanıtladığını sanmıyorum .