Как отобразить количество элементов в папке - Bash - PullRequest
1 голос
/ 16 июня 2019

Когда я выполняю команду ls -l -h, я получаю вывод, как показано на рисунке ниже. enter image description here

Каким образом количество элементов в папке может быть включено в вывод?

Обновление Токовый выход выглядит так

total 41M
-rw-r--r-- 1 root     root      41M Dec 20 09:56 completed_projects.bson
-rw-r--r-- 1 root     root      213 Dec 20 09:57 completed_projects.metadata.json
drwxrwxr-x 2 adipster adipster 4.0K Jun 16 13:22 contents
-rw-rw-r-- 1 adipster adipster   13 Jun 16 13:20 file.py
drwxrwxr-x 4 adipster adipster 4.0K Jun 16 13:22 folder
drwxrwxr-x 2 adipster adipster 4.0K Jun 16 13:21 items

Но мне бы хотелось, чтобы в другом столбце было указано количество элементов в папке, подобной этой

total 41M
-rw-r--r-- 1 root     root      41M Dec 20 09:56 completed_projects.bson
-rw-r--r-- 1 root     root      213 Dec 20 09:57 completed_projects.metadata.json
drwxrwxr-x 2 adipster adipster 4.0K Jun 16 13:22 contents  235
-rw-rw-r-- 1 adipster adipster   13 Jun 16 13:20 file.py  
drwxrwxr-x 4 adipster adipster 4.0K Jun 16 13:22 folder  19
drwxrwxr-x 2 adipster adipster 4.0K Jun 16 13:21 items  5

где цифры в крайнем правом углу представляют количество элементов в папке

Ответы [ 3 ]

2 голосов
/ 16 июня 2019

sed имеет возможность выполнить построенную замену с /e. Мы считаем только субдиректории, глядя на первый символ

ls -l | sed -r 's/d(.*) ([^ ]*)/printf "d%s %-20s%s\n" "\1" \2 $(ls \2| wc -l)/e'

РЕДАКТИРОВАТЬ: Решение для каталогов с пробелами в их имени.

Парсинга ls следует избегать. Когда вы попытаетесь исправить выше cmmand для имен каталогов с пробелами, вы можете попробовать

# Don't do this
ls -l | sed -r 's/d(.{,48}) (.*)/printf "d%s %-20s%s\n" "\1" "\2" $(ls "\2"| wc -l)/e'

Пора написать сценарий. Возможно с find или что-то вроде

#/bin/bash
for i in *; do
   printf "%-70s %s\n" "$(/bin/ls -ld "$i")" "$(/bin/ls -d "$i"/* 2>/dev/null| wc -l)"
done

wc в поддиректории будет неверным, если в именах файлов есть новые строки.

1 голос
/ 16 июня 2019
ls() { command ls "$@" | tee >(echo "$(wc -l) items"); }

Это использует подстановку процесса вывода для запуска маленького скрипта "echo" на своем стандартном вводе, в то же время отображая стандартный вывод (благодаря tee).Таким образом, вам не нужно запускать ls дважды.

Обычное предупреждение: вывод будет неправильным, если есть файл с новой строкой в ​​имени.

1 голос
/ 16 июня 2019

Вы можете сделать что-то вроде этого:

echo -n "Number of files in folder is: " && ls | wc -l && ls -l

Выход должен быть примерно таким:

umber of files in folder is: 3
Total 279K
-rwxr-xr-x 1 user users 19K Jun 16 00:17 a
-rwxr-xr-x 1 user users 5K Jun 16 00:17 b
-rwxr-xr-x 1 user users 255K Jun 16 00:17 c

Вы можете опустить оператор echo, просто как примечание -n нет новой строки флаг.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...