Моей задачей было напечатать количество файлов в текущем каталоге без использования команд ls и wc .

Я набрал следующие строки в скрипте:

#!/bin/bash
find . -maxdepth 1 -type f \( ! -iname ".*" \) > list3
grep .* -c list3 > /dev/tty

Выход:

..:0
.6.1c.sh.swp:1
list3:22

в то время как, насколько я понимаю, это должно быть только: 22

Почему это не работает?

2 ответа2

3

Почему grep не работает правильно

Это не работает, потому что вы должны сказать grep что .* - это фактический шаблон, который вы ищете.

grep '.*' -c list3

Если вы не используете одинарные кавычки, ваша оболочка расширится .* До имен каждого файла в вашем каталоге. Это называется расширением имени файла. Например, a.txt b.txt , поэтому grep увидит:

grep a.txt b.txt -c list3

Поскольку одинарные кавычки не позволяют расширению произойти, это путь сюда.


Где ваша команда grep неверна:

Кстати, вы идете в неправильном направлении с узором здесь. Период . в регулярном выражении соответствует любой символ, а не буквальная точка. Смотрите man страницу для получения дополнительной информации. Итак, ваше регулярное выражение в настоящее время говорит: «найти любой символ, а затем последовательность любого символа». Совершенно излишним.

Если вы действительно хотите соответствовать:

[точка] [что-нибудь еще]

... вам нужно уйти от точки:

\.*

Где ваша команда find может быть улучшена:

Я не знаю, что вы имеете в виду, чтобы избавиться от

\( ! -iname ".*" \)

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

find . -maxdepth 1 -type f
1

Чтобы решить исходную проблему, считая файлы без ls и wc:

Чистый синтаксис оболочки:

files=0
for i in *; do
    [ -f "${i}" ] && files=$((files+1))
done
echo ${files}

Чтобы добавить скрытые файлы в счетчик, просто измените настройки глобализации перед циклом for .

В качестве альтернативы: удовольствие от find и расширения оболочки:

echo $(($(find -maxdepth 1 -type f -printf '+1')))

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