Следующее должно работать:
for x in `find -type f -mtime +14`; do lsof "$x" >/dev/null && echo "$x in use" || echo "$x not in use" ; done
Вместо echo «$ x не используется»
команды, вы можете поместить свой команда rm "$ x"
.
Как это работает:
find
for x в ; do ; done
lsof
равен 0
, иначе выполнить команду 1: lsof "$ x" &&
Это полагается на ленивую оценку Bash для выполнения команды 1 или команды 2.
В моей системе (Ubuntu 14.04) это работает с именами файлов с пробелами в них и даже для имен файлов, содержащих ?
и *
.
Однако это не гарантирует, что он будет работать с любой оболочкой в любой системе. Пожалуйста, проверьте перед заменой команды echo
командой rm
.
Это связано с тем, что когда вы запускаете команду через ssh (ssh user@host 'command'
), она открывает оболочку входа без -. Отличное описание различий между оболочкой входа в систему и оболочкой входа без -можно найти в этом вопросе . По сути, проблема заключается в том, что когда вы запускаете команду через ssh, ваш ~/.bash_profile
не является источником, что означает, что любые изменения пути, который он делает, будут недоступны.
Решение состоит в том, чтобы либо переместить их в ваш ~/.bashrc
, который открывается при открытии не -оболочки входа в систему, либо, как вы узнали, получить ваш .bash_profile
непосредственно в скрипте.