Ошибка, которую вы получаете, означает, что в текущем каталоге нет скрытого файла или каталога. .[!.]*
расширяется, чтобы соответствовать любому файлу или каталогу, имя которого начинается с «.» за которым следует что угодно, кроме «.»; если он ничему не соответствует, он остается как есть по умолчанию. Таким образом, в вашем случае du
запускается с .[!.]*
в качестве аргумента вместо реальных имен файлов или каталогов и выдает сообщение об ошибке, которое вы видите.
Вы можете включить nullglob
, чтобы изменить поведение оболочки здесь:
shopt -s nullglob
Тогда оболочка удалит шаблоны, которые ничему не соответствуют, и du
сообщит об использовании текущего каталога, если ничего не соответствует (это его поведение по умолчанию при отсутствии аргументов).
Чтобы достичь того, что вам нужно, в Bash вы должны вместо этого сделать следующее:
du -sh .[!.]*/ */
Это расширится на все каталоги в текущем каталоге, включая скрытые. Если nullglob
не включен, он все равно будет выдавать сообщения об ошибках, но вы увидите размеры всех соответствующих каталогов.
cd "$dir" && \
find. -type d ! -name. -mtime +"$days" \
! -exec sh -c 'printf %s\\n "${1/./$PWD}" | grep -qFf /users/nordic/tokeep' {} {} \; \
-print0 -prune -o -type f -mtime +"$days" -delete |\
xargs -r0 rm -r
cd
попадании в реж. чье имя хранится в $dir
мы find
, которая жонглирует между следующими :directory
:file
удалите их, если они старше $дней. xargs
будут переданы старые каталоги, которые будут удалены. Предлагаю составить список файлов, которые нужно удалять, а не оставлять.
И начните удалять каталоги/или файлы вниз по дереву файлов, я объясню лучше:
удалить в таком порядке:
/dir1/dir2/file2
/dir1/dir2
/dir1/file1
/dir1