我尝试在 IF 语句中使用 lsof 仅当其他程序未使用目录中的文件时才压缩目录。我可以在 shell 提示符下获取此信息
lsof +d /mydir/
如果它没有返回任何输出,我就知道该目录未被使用。如何将其格式化为条件语句,以便
if (lsof returns anything) then
echo "$folder in use"
else
tar $folder
谢谢
答案1
计算答案中的字符数,如下所示:
#!/bin/bash
a="$(lsof +d "${folder}")"
if [[ "${#a}" -gt 0 ]] then
echo "${folder} in use"
else
tar "${folder}"
fi
答案2
您可以尝试计算输出中的行数。我得到一个列名称标题行,然后为每个活动进程得到一个附加结果行,例如:
COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME
bash 1002 debian cwd DIR 254,4 4096 393217 .
lsof 1592 debian cwd DIR 254,4 4096 393217 .
lsof 1593 debian cwd DIR 254,4 4096 393217 .
当我使用该wc -l
命令来计算行数时,它也会计算尾随的换行符。这意味着wc -l
当没有活动进程时应该计算 2 行输出。所以这样的事情应该有效:
if [[ $(lsof +d "${folder}" | wc -l) -gt 2 ]]; then
echo "${folder} in use"
else
tar "${folder}"
fi
看起来您可能还想使用lsof +D
调用(大写“D”而不是小写“d”)来执行目录的递归、完全下降搜索。