Есть ли способ запретить find
и ls -l
перечислять .
и ..
в их результатах? Мне никогда не интересно видеть этот результат в выводе, и это мешает мне эффективно передавать их вывод для wc -l
точного подсчета вещей.
Если это имеет значение, я работаю в zsh
.
решение1
Для ls
используйте -A
вместо -a
.
от man ls
:
-A, --almost-all
do not list implied . and ..
решение2
С zsh
:
count() echo $#
count * # non-hidden files (all types)
count *(D) # files (all types)
count **/*(D) # files recursively (all types)
count **/*(D/) # directories only (recursively)
( zsh
подстановки никогда не включаются, .
даже ..
если dotglob
они включены (как в случае с (D)
квалификатором подстановки)).
Чтобы избежать сообщения об ошибке при отсутствии файла, добавьте N
квалификатор глобализации:
count *(ND)
Это приводит к тому, что шар расширяется до нуля (нет аргумента, не пустой аргумент), если совпадений нет.
Обратите внимание, что поскольку символ новой строки является таким же допустимым символом в имени файла, передача выходных данных ls
или find
в wc -l
неверна.
Используя POSIX, можно подсчитать /
символы вместо символов новой строки:
find . ! -name . -prune -print | grep -c /
Или рекурсивно, используя этот трюк:
find .//. ! -name . -prune -print | grep -c //
решение3
Чтобы find
исключить точечные каталоги, можно использовать это:
$ find . ! -path . -type d
Пример
$ find . ! -path . -type d | head -5
./.vim_SO
./.vim_SO/bundle
./.vim_SO/bundle/vim-fugitive
./.vim_SO/bundle/vim-fugitive/plugin
./.vim_SO/bundle/vim-fugitive/doc
...