Я надеялся, что смогу сделать это с помощью find
команды, но я не вижу в руководстве никакого теста для выполнения того, что я хочу. Я хотел бы иметь возможность найти любые каталоги в рабочем каталоге, которые содержат меньшее, большее или точное количество, которое я указываю.
find . -filecount +10 # any directory with more than 10 entries
find . -filecount 20 # any directory with exactly 20 entries
Но, увы, такой возможности нет.
Ответы:
Вы можете попробовать это, чтобы получить имена подкаталогов и количество файлов / каталогов, которые они содержат:
Если вы хотите сделать то же самое для всех подкаталогов (рекурсивный поиск), используйте это вместо:
Чтобы выбрать те каталоги, которые имеют ровно 10 файлов:
10 или больше:
10 или меньше:
Если вы хотите сохранить только имя каталога (например, если вы хотите передать его другому процессу вниз по потоку, как предложено @evilsoup), вы можете использовать это:
источник
find . -type d -exec bash -c 'echo -ne "{} "; ls "{}" | wc -l' \; | awk '$NF<=10'
Чтобы перечислить непосредственные подкаталоги, содержащие именно
$NUM
файлы.Чтобы перечислить непосредственные подкаталоги, содержащие больше, чем
$NUM
файлы.Для того, чтобы перечислить немедленные подкаталоги , содержащие меньше , чем
$NUM
файлы.Элементы завершаются нулевым символом
\0
, поэтому имена файлов, содержащие символы новой строки или другие типы пробелов, будут интерпретироваться правильно.%h
Печатает каждый файлdirname
.awk
затем использует массив, чтобы подсчитать, сколько раз он встречает каждый каталог, распечатывая его, если выполняются условия.Обратите внимание, что ни одна из вышеупомянутых команд не будет отображать каталоги, содержащие ноль файлов. Также обратите внимание, что под файлом я имею в виду обычные файлы, а не ссылки, каталоги, сокеты, блоки, именованные каналы и так далее.
Я пытался сделать это как можно проще. Если вы хотите найти рекурсивные подкаталоги или файлы в них, требуется измененная команда. Есть слишком много возможностей, чтобы перечислить их все.
источник
Попробуй это:
В этих примерах вы можете проверить, содержит ли каталог CURRENT ровно 10, более 10 и менее 10 файлов / каталогов. Если вам нужно проверить несколько каталогов, просто используйте цикл.
источник
.
), вы можете изменить соответствующим образом.wc -l < <(printf %s\\n ./*)
илиprintf %s\\n ./* | wc -l
внутри теста, чтобы избежать ненужногоfind
вызова. Это также позволит избежать проблемы, отмеченной @terdon, в том числе и.
в результате. Однако, это также столкнется с проблемой игнорирования файлов, начинающихся с.
; Я бы решил это с помощьюshopt -s dotglob
(чтобы глобусы соответствовали файлам, начинающимся с.
, но не с.
или..
).