Miałem nadzieję, że będę w stanie to zrobić za pomocą find
polecenia, ale nie widzę w instrukcji żadnego testu na to, co chcę. Chciałbym móc znaleźć katalogi w katalogu roboczym, które zawierają mniej niż, więcej niż dokładnie lub określoną przeze mnie liczbę.
find . -filecount +10 # any directory with more than 10 entries
find . -filecount 20 # any directory with exactly 20 entries
Ale niestety nie ma takiej opcji.
Odpowiedzi:
Możesz spróbować, aby uzyskać nazwy podkatalogów i liczbę zawartych w nich plików / katalogów:
Jeśli chcesz zrobić to samo dla wszystkich podkatalogów (wyszukiwanie rekurencyjne), użyj tego:
Aby wybrać katalogi, które mają dokładnie 10 plików:
10 lub więcej:
10 lub mniej:
Jeśli chcesz zachować tylko nazwę katalogu (na przykład chcesz przesłać go do innego procesu poniżej, jak sugeruje @evilsoup), możesz użyć tego:
źródło
find . -type d -exec bash -c 'echo -ne "{} "; ls "{}" | wc -l' \; | awk '$NF<=10'
Aby wyświetlić listę bezpośrednich podkatalogów zawierających dokładnie
$NUM
pliki.Aby wyświetlić listę bezpośrednich podkatalogów zawierających więcej niż
$NUM
pliki.Aby wyświetlić listę bezpośrednich podkatalogów zawierających mniej niż
$NUM
pliki.Elementy są zakończone znakiem zerowym
\0
, więc nazwy plików zawierające znaki nowej linii lub inne białe znaki będą interpretowane poprawnie.%h
Drukuje każdego plikudirname
.awk
następnie używa tablicy, aby policzyć, ile razy napotyka każdy katalog, drukując go, jeśli warunki są spełnione.Należy pamiętać, że żadne z wyżej wymienionych poleceń nie wyświetla katalogów zawierających pliki zerowe. Zauważ też, że przez plik mam na myśli zwykłe pliki, a nie łącza, katalogi, gniazda, bloki, nazwane potoki itp.
Próbowałem to zrobić tak prosto, jak to możliwe. Jeśli chcesz znaleźć rekurencyjne podkatalogi lub znajdujące się w nich pliki, wymagane jest zmodyfikowane polecenie. Istnieje zbyt wiele możliwości, aby wymienić je wszystkie.
źródło
Spróbuj tego:
W tych przykładach możesz sprawdzić, czy katalog CURRENT zawiera dokładnie 10, więcej niż 10 i mniej niż 10 plików / katalogów. Jeśli chcesz sprawdzić kilka katalogów, po prostu użyj pętli.
źródło
.
), możesz chcieć odpowiednio zmodyfikować.wc -l < <(printf %s\\n ./*)
lubprintf %s\\n ./* | wc -l
w jego wnętrzu, aby uniknąć niepotrzebnegofind
połączenia. Pozwoli to również uniknąć problemu, który zauważył @terdon, polegającego.
na uwzględnieniu wyniku. Jednak miałby również problem z ignorowaniem plików zaczynających się na.
; Rozwiązałbym to za pomocąshopt -s dotglob
(aby dopasować globusy do plików zaczynających się od.
, ale nie.
lub..
).