На ум приходят два варианта печати удаляемого файла:
find /tmp -type f -mmin +100 -printf '%p was deleted!!\n' -delete
или
find /tmp -type f -mmin +100 -exec rm -v {} \;
Первый предписывает GNU find
напечатать имя файла (полностью -с указанием пути )перед его удалением; последний указывает find
выполнять rm -v
для каждого имени файла, где -v
указывает (GNU)rm
подробно рассказывать о том, что он делает.
Вывод первого будет похож на:
/tmp/.sh_history.6668 was deleted!!
/tmp/krb5cc_6094 was deleted!!
/tmp/.sh_history.18394 was deleted!!
В то время как вывод последнего будет:
removed ‘/tmp/.sh_history.6668’
removed ‘/tmp/krb5cc_6094’
removed ‘/tmp/.sh_history.18394’
Еще один момент, который следует отметить при сравнении -exec rm {}
и -delete
, заключается в том, что -exec rm
будет искать в $PATH rm
, а-delete
напрямую удаляет файл. Обычно это не проблема, но о чем нужно знать.
Пример:
$ pwd
/tmp/jeff
$ ls
bar foo rm
$ cat rm
#!/bin/sh
echo Hi, I am the fake rm: "$@"
$ PATH=/tmp/jeff:$PATH
$ find. -type f -exec rm {} \;
Hi, I am the fake rm:./rm
Hi, I am the fake rm:./bar
Hi, I am the fake rm:./foo
С помощью -delete
find
также будет проходить путь поиска в глубину -первым способом по умолчанию. Это позволяет ему удалять каталоги, в которые он позже не будет пытаться войти. Вам придется использовать find
с -depth
, если вы используете -exec rm -rf {}
для каталогов, иначе вы заставите find
жаловаться на то, что не нашли каталоги, которые, по его мнению, были там.
Вы можете вызвать функцию Readline shell-expand-line
, нажав Meta + Ctrl+e(в моей системе Meta равно Esc ), если оболочка bash
находится в режиме редактирования Emacs.
Иллюстрация:
$ echo $PATH
Если я сейчас нажму Meta + Ctrl+e , оболочка заменит всю строку на
$ echo /usr/bin:/bin:/usr/sbin:/sbin:/usr/X11R6/bin:/usr/local/bin:/usr/local/sbin
Это также расширит подстановки команд и, следовательно, потенциально выполнит части командной строки, необходимые для выполнения подстановки. Это также означает, что незаконченные вещи, такие как $(
, вызовут синтаксическую ошибку.
Это не расширяет шаблоны подстановки оболочки.
Если вы хотите использовать это в режиме редактирования Vi , вам нужно явно привязать функцию shell-expand-line
к последовательности клавиш, поскольку по умолчанию она не привязана. Например, чтобы привязать его к Ctrl+e , используйте
bind '"\C-e": shell-expand-line'
Использование той же последовательности клавиш, что и в режиме Emacs, очевидно, будет проблематичным, поскольку Esc имеет специальную функцию в режиме Vi.