Mam folder z niektórymi katalogami i niektórymi plikami (niektóre są ukryte, zaczynając od kropki).
for d in *; do
echo $d
done
zapętli wszystkie pliki, ale chcę zapętlić tylko katalogi. W jaki sposób mogę to zrobić?
Możesz określić ukośnik na końcu, aby pasował tylko do katalogów:
for d in */ ; do
echo "$d"
done
[[ -L $d ]]
czy $ d jest dowiązaniem symbolicznym.set -P
wpływa tylko na polecenia zmieniające katalog. sprunge.us/TNac[[ -L "$f" ]]
nie wyklucza dowiązań symbolicznych w tym przypadku za pomocą*/
, musisz rozebrać ukośnik końcowy za pomocą[[ -L "${f%/}" ]]
(patrz Test linku z ukośnikiem końcowym )Możesz przetestować za pomocą
-d
:Jest to jeden z operatorów testowania plików .
źródło
if [[ -d "$f" && ! -L "$f" ]]
wykluczy dowiązania symboliczneif [[ "$f" = "*" ]]; then continue; fi
Uważaj, że rozwiązanie tej choroby, choć eleganckie, może wywołać nieoczekiwane zachowanie, jeśli w bieżącym katalogu nie ma dostępnych katalogów. W tym stanie, zamiast pomijania
for
pętli, bash uruchomi pętlę dokładnie raz, gdzied
jest równa*/
:Zalecam użycie następujących elementów w celu ochrony przed tym przypadkiem:
Ten kod będzie przechodził przez wszystkie pliki w bieżącym katalogu, sprawdza, czy
f
jest to katalog, a następnie echo,f
jeśli warunek zwraca wartość true. Jeślif
jest równe*/
,echo $f
nie zostanie wykonane.źródło
shopt -s nullglob
.Jeśli musisz wybrać bardziej szczegółowe pliki, użyj tylko katalogów
find
i przekaż je dowhile read
:Służy
shopt -u dotglob
do wykluczania ukrytych katalogów (lubsetopt dotglob
/unsetopt dotglob
w zsh).IFS=
aby uniknąć podziału nazw plików zawierających jeden z$IFS
, na przykład:'a b'
zobacz AsymLabs odpowiedzieć poniżej więcej
find
opcjiedycja:
Jeśli chcesz utworzyć wartość wyjściową z pętli while, możesz obejść dodatkową podpowłokę za pomocą tej sztuczki:
źródło
Możesz użyć do tego czystej bash, ale lepiej użyć find:
(znajdź dodatkowo będzie zawierać ukryte katalogi)
źródło
shopt -s dotglob
do,bash
aby dołączyć ukryte katalogi. Twój będzie również obejmować.
. Należy również pamiętać, że-maxdepth
nie jest to standardowa opcja (-prune
jest).dotglob
Opcja jest interesująca, aledotglob
odnosi się wyłącznie do wykorzystania*
.find .
zawsze będzie zawierać ukryte katalogi (a także bieżący katalog)Odbywa się to w celu znalezienia zarówno widocznych, jak i ukrytych katalogów w bieżącym katalogu roboczym, z wyłączeniem katalogu głównego:
aby po prostu przeglądać katalogi:
w celu dołączenia dowiązań symbolicznych w wyniku:
zrobić coś z każdym katalogiem (z wyłączeniem dowiązań symbolicznych):
aby wykluczyć ukryte katalogi:
aby wykonać wiele poleceń na zwróconych wartościach (bardzo przemyślany przykład):
zamiast „sh -c” można również użyć „bash -c” itp.
źródło
... -print0 | xargs -0 ...
jeśli nie wiesz, jakie są dokładne nazwy.find * | while read file; do ...
Możesz przewijać wszystkie katalogi, w tym ukryte katalogi (zaczynające się od kropki) w jednym wierszu i wiele poleceń za pomocą:
Jeśli chcesz wykluczyć dowiązania symboliczne:
Uwaga: za pomocą listy
*/ .*/
działa w bash, ale również wyświetla foldery,.
a..
jednocześnie w zsh nie pokaże tych, ale wygeneruje błąd, jeśli nie ma ukryty plik w folderzeCzystsza wersja, która będzie zawierać ukryte katalogi i wykluczać ../ będzie dostępna z opcją dotglob:
(lub
setopt dotglob
w Zsh)możesz rozbroić dotglob za pomocą
źródło
Obejmuje to pełną ścieżkę do każdego katalogu na liście:
źródło
Użyj za
find
pomocą,-exec
aby przeglądać katalogi i wywoływać funkcję w opcji exec:Użyj
shopt -s dotglob
lub,shopt -u dotglob
aby włączyć / wyłączyć ukryte katalogiźródło
Zawiera listę wszystkich katalogów wraz z liczbą podkatalogów w danej ścieżce:
źródło
źródło
This
is
one
directory
with
spaces
in
the
name
- ale zostanie przeanalizowany jako wielokrotność.lub:
Możesz ustawić go jako alias
źródło
ls
odpowiedzi opartej na tej liście , która zawiera katalogi.ls
: mywiki.wooledge.org/ParsingLs