Какой надежный способ проверить, какие файлы и каталоги недавно занимали место на диске корневого раздела?

Потому что это две разные вещи. {1,2,3}является примером раскрытия фигурной скобки . Конструкция {1,2,3}расширяется оболочкой еще до того, как echoее увидит. Вы можете увидеть, что произойдет, если вы используетеset -x:

$ set -x
$ echo {1,2,3}
+ echo 1 2 3
1 2 3

Как видите, команда echo {1,2,3}расширена до:

echo 1 2 3

Однако [[:digit:]]является классом символов POSIX . Когда вы передаете его echo, оболочка также сначала обрабатывает его, но на этот раз он обрабатывается как глобус оболочки . это работает так же, как если бы вы запустили echo *, который напечатает все файлы в текущем каталоге. Но [[:digit:]]— это глобус-оболочка, который будет соответствовать любой цифре. Теперь в bash, если глобус оболочки ничему не соответствует, он будет расширен до самого себя :

.

$ echo /this*matches*no*files
+ echo '/this*matches*no*files'
/this*matches*no*files

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

$ echo /e*c
+ echo /etc
/etc

В обоих случаях echoпросто печатает то, что говорит оболочка, но во втором случае, поскольку glob соответствует чему-то (/etc), ему предлагается напечатать это что-то.

Таким образом, поскольку у вас нет файлов или каталогов, имя которых состоит ровно из одной цифры (, а это то, что [[:digit:]]соответствует ), глобус расширяется до самого себя, и вы получаете:

$ echo [[:digit:]]
[[:digit:]]

Теперь попробуйте создать файл с именем 5и запустить ту же команду:

$ echo [[:digit:]]
5

И если есть более одного совпадающего файла:

$ touch 1 5       
$ echo [[:digit:]]
1 5

Это (своего рода ), описанное в man bashв объяснении параметров nullglob, которые отключают это поведение:

nullglob
    If  set,  bash allows patterns which match no files (see
    Pathname Expansion above) to expand to  a  null  string,
    rather than themselves.

Если вы установите этот параметр:

$ rm 1 5
$ shopt -s nullglob
$ echo [[:digit:]]  ## prints nothing

$ 

1
19.12.2020, 12:31
1 ответ

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

# Get files/dirs modified during the last 15 days and then desc  sort with disk usage and print the first 10 lines
find / -mtime -15  | xargs -I {} du -sm {} | sort -rn | head -10
# Get files/dirs modified during the last 60 minutes and then desc sort with disk usage and print the first 10 lines
find / -mmin -60 | xargs -I {} du -sm {} | sort -rn | head -10
# Get files/dirs modified between 2020-12-18 and 2020-12-19 then desc sort with disk usage  and print the first 10 lines
find / -newermt 2020-12-18 ! -newermt 2020-12-19 | xargs -I {} du -sm {} | sort -rn | head -10

Если ваша система может сохранять время создания ; то вместо этого вы можете использовать crtime.

Сначала проверьте любой файл, который установлен crtime:

## Output should be different than - sign
stat -c '%w' <file>

Затем вы можете использовать ту же команду поиска с опцией BBirth Time:

# Get files/dirs **created** between 2020-12-18 and 2020-12-19 then desc  sort with disk usage and print the first 10 lines
find / -newerBt 2020-12-18 ! -newerBt 2020-12-19 | xargs -I {} du -sm {} | sort -rn | head -10

Если ваша файловая система обрабатывает Birth Time, но вы не видите ее в команде stat, вы можете проверить непосредственно на уровне устройства, на котором хранятся файлы, с помощью:

# Getting the inode number
ls -i <file>
# Then get crtime 
debugfs -R 'stat <inode_no>' <device>

Существует пакет python, написанный @PascalVKooten Поток переполнения стека под названием crtime, который можно использовать для получения времени создания, я не знаю, является ли он рекурсивным (не тестировался ), но это даст вам вывод, подобный следующему:

1552938281  /home/pascal/crtime/.gitignore
1552938285  /home/pascal/crtime/README.md
1552938282  /home/pascal/crtime/crtime
1552938288  /home/pascal/crtime/deploy.py

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

sudo crtime./ | awk '{print$1}' | sort -rn |  xargs -I {} date -d @{}

Mon Mar 18 20:44:48 +01 2019
Mon Mar 18 20:44:45 +01 2019
Mon Mar 18 20:44:42 +01 2019
Mon Mar 18 20:44:41 +01 2019

Наконец, чтобы получить последние процессы, которые редактировали определенные файлы или каталоги, вы можете использовать auditctlи настроить пользовательское правило, а затем запросить журналы с помощью ausearch.

Вы также можете использовать inotify-tools, чтобы сделать то же самое, но я думаю, что это может серьезно повлиять на использование памяти, если вы сделаете это для всей корневой файловой системы.

Lsofнельзя использовать, так как он относится к текущим открытым файлам, а не к последним.

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

1
18.03.2021, 22:42

Теги

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