10

Я надеялся, что смогу сделать это с помощью команды find но я не вижу в руководстве никакого теста на выполнение того, что я хочу. Я хотел бы иметь возможность найти любые каталоги в рабочем каталоге, которые содержат меньшее, большее или точное количество, которое я указываю.

find . -filecount +10 # any directory with more than 10 entries
find . -filecount 20 # any directory with exactly 20 entries

Но, увы, такой возможности нет.

3 ответа3

15

Вы можете попробовать это, чтобы получить имена подкаталогов и количество файлов / каталогов, которые они содержат:

find . -maxdepth 1 -type d -exec bash -c "echo -ne '{} '; ls '{}' | wc -l" \;

Если вы хотите сделать то же самое для всех подкаталогов (рекурсивный поиск), используйте это вместо:

find . -type d -exec bash -c "echo -ne '{} '; ls '{}' | wc -l" \;

Чтобы выбрать те каталоги, которые имеют ровно 10 файлов:

find . -maxdepth 1 -type d -exec bash -c "echo -ne '{} '; ls '{}' | wc -l" \; | 
  awk '$NF==10'

10 или больше:

find . -maxdepth 1 -type d -exec bash -c "echo -ne '{} '; ls '{}' | wc -l" \; | 
 awk '$NF>=10'

10 или меньше:

find . -maxdepth 1 -type d -exec bash -c "echo -ne '{} '; ls '{}' | wc -l" \; | 
 awk '$NF<=10'

Если вы хотите сохранить только имя каталога (например, если вы хотите передать его другому процессу вниз по потоку, как предложено @evilsoup), вы можете использовать это:

find . -maxdepth 1 -type d -exec bash -c "echo -ne '{}\t'; ls '{}' | wc -l" \; | 
 awk -F"\t" '$NF<=10{print $1}'
3

Чтобы перечислить непосредственные подкаталоги, содержащие ровно файлы $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 использует массив, чтобы подсчитать, сколько раз он встречает каждый каталог, распечатывая его, если выполняются условия.

Обратите внимание, что ни одна из вышеупомянутых команд не будет отображать каталоги, содержащие ноль файлов. Также обратите внимание, что под файлом я имею в виду обычные файлы, а не ссылки, каталоги, сокеты, блоки, именованные каналы и так далее.

Я пытался сделать это как можно проще. Если вы хотите найти рекурсивные подкаталоги или файлы в них, требуется измененная команда. Есть слишком много возможностей, чтобы перечислить их все.

2

Попробуй это:

[найти. | wc -l` -eq 10] && echo "Found"

[найти. | wc -l` -gt 10] && echo "Найдено"

[найти. | wc -l` -lt 10] && echo "Найдено"

В этих примерах вы можете проверить, содержит ли каталог CURRENT ровно 10, более 10 и менее 10 файлов / каталогов. Если вам нужно проверить несколько каталогов, просто используйте цикл.

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .