Chciałbym napisać coś takiego:
$ ls **.py
aby uzyskać wszystkie nazwy plików .py, rekurencyjnie chodź po hierarchii katalogów.
Nawet jeśli do znalezienia są pliki .py, powłoka (bash) daje następujące dane wyjściowe:
ls: cannot access **.py: No such file or directory
Jest jakiś sposób na zrobienie tego, co chcę?
EDYCJA: Chciałbym sprecyzować, że nie jestem zainteresowany konkretnym przypadkiem ls
, ale pytanie dotyczy składni globalnej.
nullglob
nullglob
zdecydowanie zalecam przeczytanie następujących ostrzeżeń .wc -l {**,.}/*.py
działa dobrze** nie robi nic więcej niż jeden *, oba działają w bieżącym katalogu
źródło
find
jeśli nie masz bash 4. Przykłady:yourcommand `find . -name '*.py'`
(zwróć uwagę na backticks);find . -name '*.py' -exec yourcommand {} \;
.Od wersji Bash 4 (w tym również zsh) dodano nową opcję globbing (
globstar
), która traktuje wzór**
inaczej, gdy jest ustawiony.Pasuje do wzoru wieloznacznego i zwraca pasujące nazwy plików i katalogów, zastępując wzór wieloznaczny w poleceniu dopasowanymi elementami.
Zwykle, gdy używasz
**
, działa podobnie*
, ale rekursywnie rekursuje wszystkie katalogi (jak pętla).Aby sprawdzić, czy jest włączony, sprawdź to przez
shopt globstar
(w skryptach użyjshopt -q globstar
).Przykład
**.py
działałby tylko dla bieżącego katalogu, ponieważ nie zwraca listy katalogów, które mogą być powtarzane, dlatego właśnie musisz użyć wielu symboli wieloznacznych na poziomie katalogu**/*.py
, aby mógł on wejść głębiej.Proszę znaleźć na SO kilka testów składniowych, które zrobiłem dla znalezienia wszystkich plików rekurencyjnie.
źródło