Chcę wiedzieć, ile zwykłych plików ma rozszerzenie .c
w dużej złożonej strukturze katalogów, a także w ilu katalogach te pliki są rozmieszczone. Dane wyjściowe, których chcę, to tylko te dwie liczby.
Widziałem to pytanie, jak uzyskać liczbę plików, ale muszę też znać liczbę katalogów, w których znajdują się pliki.
- Moje nazwy plików (w tym katalogi) mogą zawierać dowolne znaki; mogą zaczynać się od
.
lub-
i mieć spacje lub znaki nowej linii. - Mogę mieć pewne dowiązania symboliczne, których nazwy kończą się
.c
, i dowiązania symboliczne do katalogów. Nie chcę, aby dowiązania symboliczne były śledzone lub liczone, a przynajmniej chcę wiedzieć, czy i kiedy są one liczone. - Struktura katalogów ma wiele poziomów, a katalog najwyższego poziomu (katalog roboczy) zawiera co najmniej jeden
.c
plik.
Pośpiesznie napisałem kilka poleceń w powłoce (Bash), aby je policzyć, ale nie sądzę, aby wynik był dokładny ...
shopt -s dotglob
shopt -s globstar
mkdir out
for d in **/; do
find "$d" -maxdepth 1 -type f -name "*.c" >> out/$(basename "$d")
done
ls -1Aq out | wc -l
cat out/* | wc -l
Powoduje to wysyłanie skarg na niejednoznaczne przekierowania, pomijanie plików w bieżącym katalogu i wyzwalanie znaków specjalnych (na przykład przekierowane find
wyjście drukuje nowe wiersze w nazwach plików ) i zapisuje całą masę pustych plików (ups).
Jak w sposób niezawodny wyliczyć moje .c
pliki i zawierające je katalogi?
Jeśli to pomaga, oto kilka poleceń, aby utworzyć strukturę testową ze złymi nazwami i dowiązaniami symbolicznymi:
mkdir -p cfiles/{1..3}/{a..b} && cd cfiles
mkdir space\ d
touch -- i.c -.c bad\ .c 'terrible
.c' not-c .hidden.c
for d in space\ d 1 2 2/{a..b} 3/b; do cp -t "$d" -- *.c; done
ln -s 2 dirlink
ln -s 3/b/i.c filelink.c
W powstałej strukturze 7 katalogów zawiera .c
pliki, a 29 zwykłych plików kończy się na .c
(jeśli dotglob
jest wyłączone, gdy polecenia są uruchamiane) (jeśli się przeliczyłem, daj mi znać). To są liczby, których chcę.
Prosimy nie korzystać z tego konkretnego testu.
NB: Odpowiedzi w dowolnej powłoce lub innym języku będą przeze mnie testowane i doceniane. Jeśli będę musiał zainstalować nowe pakiety, nie ma problemu. Jeśli znasz rozwiązanie GUI, zachęcam do udostępnienia (ale nie mogę posunąć się tak daleko, aby zainstalować cały DE, aby go przetestować) :) Używam Ubuntu MATE 17.10.