我能够获得两个列表(/ etc / passwd和/ home),但是如何编写/ etc / passwd的读取行,解析主目录,然后在/ home中查找。如果它不存在,则抛出一个错误,如果确实存在,则移动。
用户/ etc / passwd主目录列表
cut -d":" -f6 /etc/passwd | grep home | sort
/ home
中的用户列表ls -1 /home | (while read line; do echo "/home/"$line; done)
也许将第一个命令输出到文件,然后将每一行读入一个find命令并......或者用
进行测试if [ -d "$DIRECTORY" ]; then
echo "directory found for user that doesn't exist"
fi
现在如何把它们放在一起......
编辑:isedev正是我所需要的。我可能错误地记录了我原来的消息......我们一直在清理用户,但没有清理他们/ home目录。所以我想知道仍然存在没有/ etc / passwd条目的/ home目录。这对T
有用 for name in /home/*; do
if [ -d "$name" ]; then
cut -d':' -f6 /etc/passwd | egrep -q "^$name$"
if [ $? -ne 0 ]; then
echo "directory $name does not correspond to a valid user"
fi
fi
done
userdel -r login
答案 0 :(得分:2)
作为第一近似值:
perl -F: -lane 'next if m/^#/;print "$F[5] for user $F[0] missing\n" unless(-d $F[5])' /etc/passwd
如果您想查找/etc/passwd
和/home
comm <(find /home -type d -maxdepth 1 -mindepth 1 -print|sort) <(grep -v '^#' /etc/passwd | cut -d: -f6| grep '/home' | sort)
以狭义的形式
comm <(
find /home -type d -maxdepth 1 -mindepth 1 -print |sort
) <(
grep -v '^#' /etc/passwd |cut -d: -f6 |grep /home |sort
)
如果您将使用
comm ...
(如上所述没有args)将显示3个列1.)仅在/ home 2.)仅在/ etc / passwd中3.)common comm -23 ....
- 将显示仅在/ home中的目录(而不在/etc/passwd
中)comm -13 ....
- 将显示目录中只有/ etc / passwd而不是/home
comm -12 ....
- 将显示正确的目录(存在于/etc/passwd
和/home
中)我不确定AIX上的-{max|min}depth
..
答案 1 :(得分:2)
这将报告来自/etc/passwd
但/home
但不是cut -d":" -f6 /etc/passwd | grep home | sort |
while read dir; do [ -e "$dir" ] || echo Missing $dir; done
的所有主目录:
cut -d":" -f6 /etc/passwd | while read dir; do
[ -e "$dir" ] || echo Missing $dir
done
这个报告所有不存在的内容:
{{1}}
答案 2 :(得分:1)
因此,假设您想知道/ home下是否存在与现有用户不对应的目录:
for name in /home/*; do
if [ -d "$name" ]; then
cut -d':' -f6 /etc/passwd | egrep -q "^$name$"
if [ $? -ne 0 ]; then
echo "directory $name does not correspond to a valid user"
fi
fi
done
然后再次假设您没有使用LDAP或NIS等名称服务,在这种情况下,请将以cut
开头的行更改为:
getent passwd | cut -d':' -f6 | egrep -q "^$name$"