Искать файлы в текущем каталоге, которые не соответствуют шаблону

#!/bin/bash

find "$1" ! -type d |
while read fpath; do
    fname="${fpath##*/}"
    suffix="${fname##*.}"

    if [[ "$suffix" == "$fname" ]]; then
        suffix="(none)"
    fi

    size="$( stat --format '%s' "$fpath" )"

    printf '%s\t%d\n' "$suffix" "$size"
done |
awk '{ sz[$1] += $2 }
     END { for (s in sz) { printf("%s:\t%d\n", s, sz[s]) } }'

Учитывая каталог в командной строке, приведенный выше сценарий bash будет использовать stat 1 для получить размер каждого отдельного файла в каталоге и ниже в байтах. Цикл while также обрезает суффикс для каждого файла и выводит его вместе с размером файла (в байтах).

awk сценарий 2 в конце суммирует и распечатывает информацию.

Пример, запуск каталога одного из моих рабочих проектов:

$ bash ./script.sh /home/kk/Work/Development/project/src/
c:      4559172
am:     369
h:      151369
o:      4613432
in:     42216
out:    3282712
(none): 2908962
Po:     18414
txt:    7129

При необходимости вывод может быть дополнительно отфильтрован и отформатирован.

Изменение этого параметра для определения процентов от общего размера или использования файла для получения типа файла вместо того, чтобы полагаться на суффикс имени файла, или для вывода размеров в единицах, отличных от байтов, оставлено на усмотрение читателя. как на упражнении.

1 Вызов stat здесь адаптирован для GNU stat из пакета GNU coreutils. статистика в OpenBSD полностью отличается.

2 Предполагается, что сценарий awk запускается реализацией awk , которая знает об ассоциативных массивах, например GNU awk или ] mawk .

1
11.09.2016, 01:11
2 ответа

О чем я думал ?!

$ ls *.!(ogg)
foo.mp4
0
27.01.2020, 23:25

Используйте find вместо ls . С помощью find вы можете исключить одно или несколько глобальных выражений. Для вашего примера (и OSX) вы можете сделать

find * -depth 0 -type f ! -name '*.ogg'  -ls

, который выдаст что-то вроде ls -l (только для файлов, учитывая -тип f ):

66294163        0 -rw-r--r--    1 tom              wheel                   0 Sep  9 20:12 foo.mp4

With OSX, первый столбец - это значение inode, а затем счетчик ссылок. find не предоставляет столько возможностей для листинга, сколько ls :

$ ls -l
total 0
drwx------  3 thomas  wheel  102 Sep  9 15:33 com.apple.launchd.OFStJ79qtq
drwx------  3 thomas  wheel  102 Sep  9 15:33 com.apple.launchd.VQsV1ae6bI
drwx------  3 thomas  wheel  102 Sep  9 15:33 com.apple.launchd.e6HBMt2vnS
drwx------  3 thomas  wheel  102 Sep  9 15:33 com.apple.launchd.he9U4OAIMI
-rw-r--r--  1 tom     wheel    0 Sep  9 20:12 foo.mp4
-rw-r--r--  1 tom     wheel    0 Sep  9 20:12 foo.ogg

, но может быть полезным.

3
27.01.2020, 23:25

Теги

Похожие вопросы