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 -P
yalnı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 for
döngü, bash tam olarak nerede bir kez döngü çalışır d
eş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 f
koşul doğru dönerse eko olur. Eğer f
eşittir */
, echo $f
yürütülmez.
shopt -s nullglob
.
Yalnızca dizinlerin kullandığından daha belirli dosyalar seçmeniz gerekiyorsa find
ve bunu iletin while read
:
shopt -s dotglob
find * -prune -type d | while IFS= read -r d; do
echo "$d"
done
shopt -u dotglob
Gizli dizinleri hariç tutmak için kullanın (veya setopt dotglob
/ unsetopt dotglob
in 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 find
seç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 dotglob
için kullanabilirsiniz bash
. Seninkiler de içerecek .
. Ayrıca -maxdepth
standart bir seçenek olmadığını unutmayın ( -prune
is).
dotglob
Seçenek ilginç ama dotglob
sadece 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 dotglob
zsh 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 find
ile -exec
dizinlere 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 dotglob
veya kullanınshopt -u dotglob
ls -l | grep ^d
veya:
ll | grep ^d
Takma ad olarak ayarlayabilirsiniz
ls
temelli cevaptan biraz farklı olan soruyu yanıtladığını sanmıyorum .