9

Я хотел бы, чтобы команда BASH перечисляла только количество файлов в каждом подкаталоге каталога.

Например, в директории /tmp есть dir1 , dir2 , ... Я хотел бы увидеть :

`dir1` : x files 
`dir2` : x files ...

5 ответов5

16

Предполагая, что вам нужно только рекурсивное количество файлов, а не каталогов и других типов, что-то вроде этого должно работать:

find . -maxdepth 1 -mindepth 1 -type d | while read dir; do
  printf "%-25.25s : " "$dir"
  find "$dir" -type f | wc -l
done
11

Эта задача настолько очаровала меня, что я сам хотел найти решение. Это даже не займет цикл, и МОЖЕТ быть быстрее в скорости выполнения. Излишне говорить, что усилия Тора очень помогли мне понять вещи в деталях.

Так вот мой:

find . -maxdepth 1 -mindepth 1 -type d -exec sh -c 'echo "{} : $(find "{}" -type f | wc -l)" file\(s\)' \;

По какой-то причине это выглядит скромно, потому что это намного мощнее, чем кажется. :-)

Однако, если вы намереваетесь включить это в ваш файл .bash_aliases , он должен выглядеть так:

alias somealias='find . -maxdepth 1 -mindepth 1 -type d -exec sh -c '\''echo "{} : $(find "{}" -type f | wc -l)" file\(s\)'\'' \;'

Обратите внимание на очень сложную обработку вложенных одинарных кавычек. И нет, нельзя использовать двойные кавычки для аргумента sh -c .

2

$ найти. тип F | cut -d "/" -f2 | uniq -c

Перечисляет папки и файлы в текущей папке с количеством файлов, найденных ниже. Быстрое и полезное ИМО. (файлы показывают с количеством 1).

1

Использование find - это, безусловно, путь, если вы хотите считать рекурсивно, но если вы просто хотите подсчитать файлы непосредственно в определенном каталоге:

ls dir1 | wc -l

0

Что я использую ... Это создает массив всех подкаталогов в том, который вы задаете в качестве параметра. Распечатайте подкаталог и количество его в том же подкаталоге, пока все подкаталоги не будут обработаны.

#!/bin/bash    
directories=($(/bin/ls -l $1 | /bin/grep "^d" | /usr/bin/awk -F" " '{print $9}'))

for item in ${directories[*]}
    do
        if [ -d "$1$item" ]; then
            echo "$1$item"
            /bin/ls $1$item | /usr/bin/wc -l
        fi
    done

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