Если все, что вам нужно, это просто листинг, я бы выбрал старый добрый grep
вместо вывода find
. Это было бы медленнее, но гораздо меньше печатать.
В самом простом случае вы можете попробовать это для вашего примера:
find -printf '%u %p\n' | egrep '^br_'
Это дает вам список файлов, принадлежащих пользователям br_*
, показанный с именем пользователя и именем файла в каждой строке.
Затем вы можете расширить вывод, изменив -printf
строку формата .
Например, чтобы он больше походил на ls
вывод:
find -printf '%-8.8u %-8.8g %M %8s %t %p\n' | egrep '^br_'
Чтобы сделать командную строку максимально короткой, важно поместить имя пользователя в самое начало, чтобы часть egrep
можно было сделать такой короткой.
Чтобы увидеть все, что можно указать в строке формата, перейдите сюда , затем найдите -printf format
.
Будьте осторожны, если ваши файлы содержат символы новой строки в именах, это решение может иметь проблемы с их отображением.
Во избежание сообщений об ошибках
find /tmp -type f -user $USER -exec rm -f {} \;
вы можете либо перенаправить их
find /tmp -type f -user $USER -exec rm -f {} \; 2>/dev/null
или предотвратить find
столкновение с этой проблемой:
find /tmp \( -type d \( -executable -o -prune \) \) -o -type f -user $USER -exec rm -f {} \;
С помощью find /tmp -type f -user $USER -exec rm -f {} \;
вы говорите find
найти и удалить все файлы, принадлежащие $USER
в везде под/tmp
.
Теперь ваш /tmp
содержит подкаталоги -, принадлежащие пользователю root. Теоретически они могут содержать больше файлов, принадлежащих $USER
. Итак, find
попытается заглянуть в эти каталоги, чтобы найти их. Но каталоги, принадлежащие root -, имеют разрешения drwx------
, поэтому только root сможет получить к ним доступ каким-либо образом.
В результате find
сообщит о каталогах, в которые ему не удалось войти, чтобы сообщить вам, что он не может искать везде под /tmp
и поэтому теоретически может что-то пропустить.
Сценарии, которые запускаются при запуске системы, будут выполняться от имени пользователя root, если не указано иное, поэтому, если вы запустите ту же команду в сценарии запуска системы -, он будет иметь полный доступ ко всем каталогам в /tmp
и будет вообще не иметь этой проблемы :find
, работающий от имени root, сможет выполнить исчерпывающий поиск во всех каталогах под /tmp
.
Но если вы запустите его как свою собственную учетную запись пользователя, вам придется либо игнорировать ошибки «Отказано в доступе», поскольку вы их ожидаете, либо выполнить более сложный поиск, который сначала ищет каталоги $USER
, к которым можно получить доступ в /tmp
, а затем удаляет из них все файлы.
Или, если вы ищете только временные файлы, созданные одним и тем же скриптом,тогда вы захотите просмотреть временные файлы в каталоге /tmp
только и игнорировать любые подкаталоги -каталога /tmp
. Если вы хотите сделать это, погуглите, как использовать опцию -prune
для find
; это немного сложно.
Команда trap
немного отличается. Его можно использовать, чтобы гарантировать, что ваш скрипт всегда будет очищать свои временные файлы (, если только он не будет уничтожен неперехватываемым сигналом, таким как SIGKILL
или системным сбоем ). В совместимой с POSIX -оболочке вы должны использовать ее следующим образом:
TMPFILE=$(mktemp)|| exit 1
trap "rm -f $TMPFILE" EXIT
В этой команде trap
EXIT
— это не команда, а условие, которое вызовет срабатывание ловушки. Условием может быть сигнал или специальное значение 0
или EXIT
. Оба этих специальных значения будут означать, что «это действие ловушки должно выполняться всякий раз, когда этот процесс оболочки по какой-либо причине завершается».