Я написал эту команду:

find -exec test -e "{}/meta" ";" -exec du -h -t 500M {} ";"

Он проверяет, находится ли файл meta в определенном месте и все ли его местоположение превышает 500 МБ. Теперь я хочу прочитать первую строку этого файла meta. Я пробовал с этим

find -exec test -e "{}/meta" ";" -exec test du -h -t 500M {} ";" -exec sed '1q;d' {}/meta ";"

Или это

find -exec test -e "{}/meta" ";" -exec du -h -t 500M {} ";" -exec head -n 1 {}/meta ";"

Но он игнорирует du и читает строку из каждого файла meta.
Как это должно выглядеть?

0
DzikiChrzan 7 Сен 2016 в 11:23

3 ответа

Лучший ответ

После попытки с find . -type d -size +500M выясняется, что параметр -size, примененный к каталогу, не проверяет общий размер его файла.

Лучше искать нужный файл и проверять размер его каталога:

find . -type f -name 'meta' -execdir bash -c 's=$(du -sh .); [[ "${s%M*}" -gt "500" ]] && sed "1q" meta' \;
1
SLePort 7 Сен 2016 в 13:16

На самом деле я бы использовал для этого цикл while в bash, например:

find -type d | \
    while IFS= read -r dir; do
        if (($(du -ms -- "$dir" | cut -f1) >= 500)); then
            [[ -e "$dir/meta" ]] && head -n1 "$dir/meta"
        fi
    done

Я также не полагаюсь на флаг -t для du, потому что он влияет только на вывод, а не на код состояния `du, поэтому вместо этого я просто использую простое арифметическое сравнение в bash.

1
redneb 7 Сен 2016 в 08:44

Другой подход - использовать -execdir:

find -name meta -type f -execdir bash -c 's=($(du -s .)) ; (( s > 2000 ))'  \; -exec head -n1 {} \;
0
wisent 7 Сен 2016 в 08:58