Общие сведения о версиях glibc

Если введенные вами данные настолько просты, насколько кажутся, то вот сценарий оболочки bash , выполняющий то, в чем сценарии оболочки не годятся. :

#!/usr/bin/env bash
declare -a col2
while read col1 rest
do
  IFS=, read -a col2 <<< "$rest"
  for value in ${col2[*]}
  do
    printf "%s %s\n" "$col1" "$value"
  done
done < input

Есть лучшие способы сделать это ( read -a специфичен для bash, а не для POSIX); есть и другие способы сделать это (awk, perl). Если ваши данные более сложные (1 a, "b, c", d) или (1 a, b \, c, d) , то этот сценарий, вероятно, не будет работать что ты хочешь.

1
26.03.2019, 09:50
2 ответа

Количество элементов в каталоге можно подсчитать, используя

set -- *

Это устанавливает позиционные параметры ($1, $2и т. д. )на имена в текущем каталоге. Количество имен, до которых расширяется *, находится в $#. Если вы используете оболочку bashи устанавливаете опцию оболочки dotglob, это дополнительно будет учитывать скрытые имена.

Использование для поиска каталогов в /grid/sdh/hadoop/yarn/local/usercache/hdfs/appcache, которые содержат более 1000 имен:

find /grid/sdh/hadoop/yarn/local/usercache/hdfs/appcache \
    -type d -exec bash -O dotglob -c '
        for pathname do
            set -- "$pathname"/*
            if [ "$#" -gt 1000 ]; then
                printf "%d\t%s\n" "$#" "$pathname"
            fi
        done' bash {} +

Это расширяет глобус оболочки *в каждом найденном каталоге и выводит путь к каталогу, если в нем более 1000 имен, вместе с количеством имен. Он делает это, выполняя короткий сценарий bashдля пакетов каталогов. Сценарий будет перебирать каждую группу каталогов и для каждого из них будет расширять глобус *внутри него, чтобы подсчитать количество записей. Оператор ifзатем запускает printf, если это необходимо.

Учтите, что если каталог содержит миллионы имен, может потребоваться некоторое время, чтобы развернуть *глобус в этом каталоге.

2
27.01.2020, 23:22

В системе GNU

(export LC_ALL=C
  find /grid/sdh/hadoop/yarn/local/usercache/hdfs/appcache -print0 |
    tr '\n\0' '\0\n' |
    sed 's|/[^/]*$||' |
    sort |
    uniq -c |
    sort -rn |
    head |
    tr '\z' '\n')

Будет перечислено 10 каталогов с наибольшим количеством записей.

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

 find /grid/sdh/hadoop/yarn/local/usercache/hdfs/appcache -type d \
   -size +10000000c -print -prune

Будет перечислять каталоги размером более 10 МБ и не входить в них.

1
27.01.2020, 23:22

Теги

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