Фильтрация списка файлов по содержимому

В подобных ситуациях я обычно сначала использую du -kx | sort -rn | lessдля перечисления каталогов в наибольшем -первом порядке. Это говорит мне, где находятся самые большие отдельные дисковые свиньи, поэтому я буду знать, где искать. Но, как сказал @SimonDoppler, если у вас нет хотя бы r-xдоступа ко всем подкаталогам -, ваш список будет неполным, :вы сможете получить только размеры каталогов, которые вы иметь доступ.

Помните, что :обычно вам нужно иметь доступ только для записи в каталог, чтобы удалить любые файлы в нем. Только если в каталоге установлен бит sticky(, т. е. последняя буква в строке букв разрешения — tвместо x), вам нужно быть владельцем файла, чтобы удалить его.

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

#!/bin/sh
if [ "$1" = "" ] || [ "$1" = "-h" ]
then
    echo "Usage: ${0##*/}  " >&2
    exit 64 # EX_USAGE
fi
if ! [ -d "$1" ]
then
    echo "ERROR: directory $1 does not exist" >&2
    exit 66 # EX_NOINPUT
fi

REPORTROOT="$1"
shift
for U in "$@"
do
    # Find all files under $REPORTROOT owned by a particular user,
    # get their sizes and sum them together.
    DISKUSE=$(find "$REPORTROOT" -type f -user "$U" \
        -exec stat -c %s {} \+ 2>/dev/null \
        | awk '{s+=$1} END {printf("%ld\n", s)}')
    # Display the result for this user.
    printf "%16s: %d\n" "$U" "$DISKUSE"
done

Обратите внимание, что это может занять некоторое время.

Строка awk one -«вычислить сумму списка чисел» взята из этого сообщения о переполнении стека . Обратите внимание на комментарии к ответу.

2
10.07.2020, 18:47
2 ответа

Если в вашей системе есть GNU xargs, вы можете сделать что-то вроде

foo | xargs -d '\n' grep -l regex
5
18.03.2021, 23:20

Сbash:

foo |
    while IFS= read -r file; do
        grep -qE "$regex" "$file" && printf '%s\n' "$file"
    done

Если ваш grepне понимает -q, вы можете использовать

grep -E "$regex" "$file" >/dev/null 2>&1

вместо этого.

3
18.03.2021, 23:20

Теги

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