команда cat/echo в команде du -sh --exclude={} вызывает длительные запуски и не работает должным образом

Изменено то, что runas вместо переключения на пользователя root работает с возможностями SETUID и SETGID , которые основаны на расширенных атрибутах исполняемых файлов. Их можно установить с помощью команды setcap.

0
10.01.2020, 19:05
2 ответа

Команда duв Linux, которую вы используете, предлагает опцию --exclude-from:

du -h -s --exclude-from=directory_list.txt /filesystem/*

или

du -h -s -X directory_list.txt /filesystem/*

Это предполагает, что файл directory_list.txtсодержит шаблоны оболочки (, а не регулярные выражения ), по одному на строку, которые следует исключить. Эти шаблоны могут быть путями или просто именами файлов или каталогов и могут включать подстановочные символы оболочки.


В вашей команде, которая использует --exclude={`cat directory_list.txt`}, вы пытаетесь заставить оболочку выполнить раскрытие скобок, используя содержимое directory_list.txt. Это не работает, так как расширение фигурных скобок выполняется до того, как подстановки команд будут даже рассмотрены.

То, что вы могли бы сделать, если бы у вашего duне было --exclude-from, — это считать вещи, которые нужно исключить из вашего файла, в массив, и при этом добавить --exclude=к каждому элементу, а затем использовать этот массив в вызовеdu:

exclude=()
while IFS= read -r item; do
    exclude+=( --exclude="$item" )
done <directory_list.txt

du -h -s "${exclude[@]}" /filesystem/*

Предполагается, что, как и в случае с --exclude-from, ваш файл содержит по одному шаблону на строку.

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

set --
while IFS= read -r item; do
    set -- "$@" --exclude="$item"
done <directory_list.txt

du -h -s "$@" /filesystem/*

Здесь используется список позиционных параметров вместо именованного массива.

Оба этих цикла также сохранят пробелы в путях и не позволят оболочке ошибочно расширять шаблоны подстановки имен файлов, что является парой проблем с вашей grep -v $(cat directory_list.txt)командой (другая заключается в том, что вы пройдете большинство путей из файлов в grepкак файлы для поиска, а не как шаблоны для исключения ).

1
28.01.2020, 02:57

Это не дает точного ответа на ваш вопрос, но иногда люди делают конвульсии с du -shв попытках найти дисковую свинью.

Если это так, вам следует рассмотреть инструмент ncdu. Он основан на проклятиях и быстр, и будет сортировать все по общему дисковому пространству, когда вы перемещаетесь по дереву с помощью клавиш со стрелками.

-1
28.01.2020, 02:57

Теги

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