Чтобы перечислить непосредственные подкаталоги, содержащие ровно файлы $NUM
.
find -maxdepth 2 -mindepth 2 -type f -printf '%h\0' | awk -v num="$NUM" 'BEGIN{RS="\0"} {array[$0]++} END{for (line in array) if (array[line]==num) printf "%s\n", line}'
Для того, чтобы перечислить немедленные подкаталоги , содержащие больше , чем $NUM
файлов.
find -maxdepth 2 -mindepth 2 -type f -printf '%h\0' | awk -v num="$NUM" 'BEGIN{RS="\0"} {array[$0]++} END{for (line in array) if (array[line]>num) printf "%s\n", line}'
Вывести список непосредственных подкаталогов, содержащих менее $NUM
файлов.
find -maxdepth 2 -mindepth 2 -type f -printf '%h\0' | awk -v num="$NUM" 'BEGIN{RS="\0"} {array[$0]++} END{for (line in array) if (array[line]<num) printf "%s\n", line}'
Элементы заканчиваются нулевым символом \0
, поэтому имена файлов, содержащие символы новой строки или другие типы пробелов, будут интерпретироваться правильно. %h
печатает dirname
каждого файла. Затем awk
использует массив, чтобы подсчитать, сколько раз он встречает каждый каталог, распечатывая его, если выполняются условия.
Обратите внимание, что ни одна из вышеупомянутых команд не будет отображать каталоги, содержащие ноль файлов. Также обратите внимание, что под файлом я имею в виду обычные файлы, а не ссылки, каталоги, сокеты, блоки, именованные каналы и так далее.
Я пытался сделать это как можно проще. Если вы хотите найти рекурсивные подкаталоги или файлы в них, требуется измененная команда. Есть слишком много возможностей, чтобы перечислить их все.