Если вам нужны только обычные файлы,
С GNU найдите
:
find . -maxdepth 1 -type f -printf . | wc -c
Другое найдите
s:
find . ! -name . -prune -type f -print | grep -c /
( вам не нужен -print | wc -l
, поскольку это не сработает, если есть имена файлов с символами новой строки).
С zsh
:
files=(*(ND.)); echo $#files
С ls
:
ls -Anq | grep -c '^-'
Чтобы включить символические ссылки на обычные файлы, измените -type f
на -xtype f
с помощью GNU find
или -exec test -f {} \;
с другими find
или .
с -.
с помощью zsh
или добавьте параметр -L
в ls
. Однако обратите внимание, что вы можете получить ложноотрицательных в случаях, когда тип цели символической ссылки не может быть определен (например, потому что он находится в каталоге, к которому у вас нет доступа).
Если вам нужен файл любого типа (символическая ссылка, каталог, каналы, устройства ...), а не только обычный:
find . ! -name . -prune -printf . | wc -c
(измените на -print | grep -c /
с не- GNU найти
, (ND.)
до (ND)
с zsh
, grep -c '^ -'
с wc -l
с ls
).
Однако это не будет учитываться .
или ..
(как правило, никто особо не заботится о них, поскольку они всегда там), если вы не замените -A
на -a
на LS
.
Если вам нужны все типы файлов, кроме каталогов, замените -тип f
на ! -type d
(или ! -xtype d
, чтобы также исключить символические ссылки на каталоги), а с помощью zsh
заменить .
на ^ /
и на ls
, замените grep -c '^ -'
на grep -vc '^ d'
.
Если вы хотите исключить скрытые файлы, добавьте ! -name '. *'
или с помощью zsh
, удалите D
или с помощью ls
, удалите A
.
Это выражение perl
поможет,
perl -i -ne 'next if /apache 4.2/;s+Os version rhel5.6+Os version rhel5.6\napache 4.2+; print' ssss
Пояснение
далее, если / apache 4.2 /
пропускает любые строки, соответствующие apache 4.2
. s + Os версия rhel5.6 + Os версия rhel5.6 \ napache 4.2+; print
search Os version rhel5.6
и заменяет строку такой же с добавлением apache 4.2
в новую строку. Проверьте исходный файл
$ cat ssss
Hostname example.com
Os version rhel5.6
apache 4.2
Hostname example2.com
Os version rhel5.6
$ perl -ne 'next if /apache 4.2/;s+Os version rhel5.6+Os version rhel5.6\napache 4.2+; print' ssss
Hostname example.com
Os version rhel5.6
apache 4.2
Hostname example2.com
Os version rhel5.6
apache 4.2
Вот один из способов сделать это с помощью sed
:
sed '/Os version rhel5\.6/{
a\
apache 4.2
$!{
n
/^apache 4\.2$/d
}
}' infile
Это добавляет apache 4.2
безусловно для всех строк, соответствующих Os версии rhel5.6
, затем (если не в последней строке) он вставляет следующую строку через n
(печать пространства шаблонов) и если новое содержимое пространства шаблонов совпадает с apache 4.2
, оно удаляется. При необходимости отрегулируйте регулярное выражение, чтобы включить начальные / конечные пробелы, например. / ^ [[: blank:]] * apache 4 \ .2 [[: blank:]] * $ / d