Я хотел бы, чтобы команда BASH перечисляла только количество файлов в каждом подкаталоге каталога.
Например, в директории /tmp
есть dir1
, dir2
, ... Я хотел бы увидеть :
`dir1` : x files
`dir2` : x files ...
Предполагая, что вам нужно только рекурсивное количество файлов, а не каталогов и других типов, что-то вроде этого должно работать:
find . -maxdepth 1 -mindepth 1 -type d | while read dir; do
printf "%-25.25s : " "$dir"
find "$dir" -type f | wc -l
done
Эта задача настолько очаровала меня, что я сам хотел найти решение. Это даже не займет цикл, и МОЖЕТ быть быстрее в скорости выполнения. Излишне говорить, что усилия Тора очень помогли мне понять вещи в деталях.
Так вот мой:
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
.
$ найти. тип F | cut -d "/" -f2 | uniq -c
Перечисляет папки и файлы в текущей папке с количеством файлов, найденных ниже. Быстрое и полезное ИМО. (файлы показывают с количеством 1).
Использование find - это, безусловно, путь, если вы хотите считать рекурсивно, но если вы просто хотите подсчитать файлы непосредственно в определенном каталоге:
ls dir1 | wc -l
Что я использую ... Это создает массив всех подкаталогов в том, который вы задаете в качестве параметра. Распечатайте подкаталог и количество его в том же подкаталоге, пока все подкаталоги не будут обработаны.
#!/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