Linux - List users which have specific directory

时间:2016-04-04 18:18:34

标签: linux bash

I am trying to create a script which will list the name of the user, only if that specific user has a specific and available directory in his folder.

#!/bin/bash
for i in `cat /etc/passwd | cut -d : -f5\,6 | cut -d : -f2`
do
        cd $i
        if [ -d public_html ]
        then
                echo `cat /etc/passwd | cut -d : -f5,6 | cut -d : -f1`
        fi
done

First, I get a list of all the user names that have home folders. Then, for each user, I enter in his directory If in his directory, public_html directory is found, echo the user.

When I run this in the terminal, all the users are listed:

cat /etc/passwd | cut -d : -f5,6 | cut -d : -f1

However, I need to somehow get the user i from that whole list.

Can anybody be so kind to explain what I´m doing wrong, and what to look out for?

4 个答案:

答案 0 :(得分:2)

You're getting the wrong result because you're checking for a file (with -f). Try using -d.
Using cat and cut is not bash either and can easily be replaced with script in most cases.

I'd do something like this:
while IFS=: read -r user pass uid gid desc homedir shell; do [ -d "$homedir"/public_html ] && echo "$user"; done < /etc/passwd

We set the field separator (IFS) to : (since that's what /etc/passwd uses), we read the file in and set the variables we want to use. Then for each line we do the test and (&&) if the test is successful we echo the result.

The quotes are not really necessary since we know the formatting of the file but good practice.

答案 1 :(得分:0)

If users' home directories are set up in the standard way:

cd /home
for pubdir in */public_html/ ; do
    echo "${pubdir%%/*}"
done

答案 2 :(得分:0)

我做了贫民窟风格......

#!/bin/bash
counter=0
for i in `cat /etc/passwd | cut -d : -f6`
do
        if [ -r $i ]
        then
                cd $i
                if [ -d public_html ]
                then
                        counter2=2
                        for j in `cat /etc/passwd | cut -d : -f5`
                        do
                                counter2=$(($counter2 + 1))
                                if [ $counter -eq $counter2 ]
                                then
                                        echo $j
                                fi
                        done
                fi
                counter=$(($counter + 1))
        fi
done

答案 3 :(得分:0)

#!/bin/bash
getent passwd | awk -F: '{printf "%s\t%s\n",$1, $6}'| while read -r user home
do
  if [ -d ${home}/public_html ] ; then
    echo ${user}
  fi
done

无论是使用/ etc / passwd还是ldap ...

,这都应该有效