Потому что это две разные вещи. {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
$
Вы можете использовать приведенные выше простые команды, чтобы получить последние измененные файлы и каталоги, используя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>
Затем вы можете использовать ту же команду поиска с опцией B
Birth 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
, вы можете экспортировать вывод в файл.