Я хочу найти подкаталог текущего каталога, который (то есть подкаталог) содержит 2 или более обычных файлов.
Меня не интересуют каталоги, содержащие менее 2 файлов, а также каталоги, которые содержат только подкаталоги.
Здесь совершенно другой подход, основанный на GNU find
и uniq
. Это намного быстрее и намного проще для процессора, чем ответы, основанные на выполнении команды оболочки, которая считает файлы для каждого найденного каталога.
find . -type f -printf '%h\n' | sort | uniq -d
Команда find
печатает каталог всех файлов в иерархии и uniq
отображает только те каталоги, которые появляются как минимум дважды.
find
. В этом случае, потому что GNUfind
будет искажать имена каталогов, в которых есть символы, которые нельзя распечатать в текущей локали (например, «ä» в локали C). См. Также unix.stackexchange.com/questions/321697/…-printf '%h\0' | sort -z | uniq -zd | xargs -r0 ...
Это позволит найти все имена в текущем каталоге или под ним, а затем отфильтровать все имена, которые не являются именами каталогов.
Остальные имена каталогов будут переданы этому короткому сценарию:
Этот скрипт будет подсчитывать количество обычных файлов (пропуская символические ссылки) в каталоге, указанном в качестве первого аргумента командной строки (from
find
). Последняя команда в скрипте - это проверка, чтобы увидеть, было ли количество 2 или больше. Результатом этого теста является возвращаемое значение (состояние выхода) скрипта.Если проверка прошла успешно,
-print
будетfind
распечатан путь к каталогу.Чтобы также рассмотреть скрытые файлы (файлы, имена которых начинаются с точки), измените
sh -c
сценарий со словв
Тестирование:
источник
[ "" -ge 2 ]
как это допустимый тест.dash
,bash --posix
иtest
все отображают сообщение об ошибке и выходят с 2 (т.е. «Произошла ошибка»)ksh
работала какsh
. Скорректирую сразу. Спасибо, что тыкаешь в меня! :-)[ -f ... ]
разыменовываются символические ссылки. Вы должны добавить тест, чтобы устранить их, так как вопрос указывает, что должны учитываться только обычные файлы.С помощью ответа Жиля о SU и его реверсе и некоторой модификации, вот что вам нужно.
Дерево каталогов.
Результат:
источник
test
и теdir2
каталоги , в моей тестовой конфигурации (см мой ответ).test/x1
и вtest/x2
виде файлов ...$1
и$2
будет каталогами дляtest
, и каталог будет пропущен.Еще один
find
+wc
подход:path/currdir
- путь к вашей текущей директории-maxdepth 1
- учитывать только прямые дочерние подпапки! -empty
- игнорировать пустые подпапки! -path "path/currdir"
- игнорировать текущий путь к каталогуcount=$(find "$1" -maxdepth 1 -type f | wc -l)
-count
присваивается количество файлов для каждой найденной подпапки[ $count -ge 2 ] ... -print
- напечатать имя / путь к подпапке, содержащей 2 или более обычных файлаисточник