在bash中搜索多个目录

时间:2013-05-31 14:11:07

标签: linux bash unix scripting centos

我正在试图弄清楚如何搜索多个目录,用pushd定义,以便找到列表中文件夹的磁盘空间,以及是否有任何文件夹是sym链接。现在我有一些非常低效的for循环,它们不能在多个目录上运行(如果只有一个目录,它可以正常工作,但是一旦我开始用pushd定义多个工作目录,它就会搞砸了)。

更新

$ COMPARE的内容供参考:

COMPARE=`comm -23 "$HOMEOUT" "$USEROUT" |
            comm -23 - <(
                for f in "${FILTER[@]}"; do
                    echo "$f"
                done | sort)`

执行它时,这是我的代码和结果:

DIRS=`ls -lah / | grep home | awk '{ print $9 }'`

 for i in "$DIRS"; do
    pushd /$i/ >/dev/null
 done

# Find the disk space of each folder

for x in "$DIRS"; do
        du -s /$x/$COMPARE | sort -n | cut -f 2-|xargs -i du -sh {}
done


# Check for and output symlinks
SYM=`for y in "$COMPARE"; do
    find /$DIRS/$y -maxdepth 1 -type l -print
done`

结果:

+ DIRS='home
home2
home3
old_home'
+ for i in '"$DIRS"'
+ pushd /home home2 home3 old_home/
+ for x in '"$DIRS"'
+ sort -n
+ du -s /home home2 home3 old_home/someuser someuser2 someuser3 someuser4
+ cut -f 2-
+ xargs -i du -sh '{}'

正如您所看到的,这不起作用,因为我希望它像这样搜索列表中的每个用户(取决于他们的文件夹所在的位置):

/家庭/用户 /家庭/用户2 / HOME2 /用户3 / home3 / USER4

有人可以建议更好/更有效的方法来实现这个吗?我想弄清楚我如何能够总结这一点。

Bash版本:

  

GNU bash,版本3.2.25(1)-release-(x86_64-redhat-linux-gnu)

提前致谢!

1 个答案:

答案 0 :(得分:1)

"$DIRS"将扩展为"home home2 ...",因此for会将其视为单个令牌。并且不解析ls,它非常脆弱。使用:

for x in /*home*; do
    du -sh "$x" | sort -h
done

(请注意,sort -h是一个gnu扩展名,但是当你使用redhat时,你应该拥有它。)
你没有向我们展示你如何构建$COMPARE,但我认为你正在寻找这个而不是第二个循环:

find /*home*/* -maxdepth 1 -type l

如果您只想要一些用户,则必须向我们展示如何构建$COMPARE;您可能希望将其设为数组并使用find /*home*/"${COMPARE[@]}" ...


通过将COMPARE包装在()中来构建IFS=$'\n' COMPARE=($(comm -23 "$HOMEOUT" "$USEROUT" | comm -23 - <(printf "%s\n" "${FILTER[@]}" | sort))

find /*home*/"${COMPARE[@]}" -maxdepth 1 -type l

并使用它:

{{1}}