Linux 在bash中搜索多个目录
我试图弄清楚如何搜索多个目录(用pushd定义),以便找到列表中文件夹的磁盘空间,以及是否有任何文件夹是sym链接。现在我有一些非常低效的for循环,它们不能在多个目录上工作(如果只有一个目录,它就可以正常工作,但是一旦我开始用pushd定义多个工作目录,它就会把事情搞砸) 更新:Linux 在bash中搜索多个目录,linux,bash,unix,scripting,centos,Linux,Bash,Unix,Scripting,Centos,我试图弄清楚如何搜索多个目录(用pushd定义),以便找到列表中文件夹的磁盘空间,以及是否有任何文件夹是sym链接。现在我有一些非常低效的for循环,它们不能在多个目录上工作(如果只有一个目录,它就可以正常工作,但是一旦我开始用pushd定义多个工作目录,它就会把事情搞砸) 更新: + DIRS='home home2 home3 old_home' + for i in '"$DIRS"' + pushd /home home2 home3 old_home/ + for x in '"$DI
+ 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 '{}'
$COMPARE的内容供参考:
COMPARE=`comm -23 "$HOMEOUT" "$USEROUT" |
comm -23 - <(
for f in "${FILTER[@]}"; do
echo "$f"
done | sort)`
结果:
+ 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/user3
/home3/user4
有人能提出一种更好/更有效的方法来做到这一点吗?总的来说,我想弄清楚我怎样才能把它浓缩
Bash版本:
GNUBash,版本3.2.25(1)-发布-(x86_64-redhat-linux-GNU)
提前谢谢 “$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[@]}”…
通过在
()
中将比较构建为一个数组
为什么要将目录推到目录堆栈上?。此外,不需要创建DIRS
变量;只需对i in/home/*使用;do
在bash脚本中拥有多个工作目录似乎是最好的方法,因为我想搜索服务器上找到的任何/home*目录。如果不是这样的话,我愿意用一种更好的方法来实现它;一次只有一个工作目录。您从不使用堆栈,因为您从不调用cd
或popd
。但是,您也从不使用工作目录,由于您总是将要搜索的目录作为显式参数传递给du
和find
。您不必在目录中才能读取它。下一个问题:什么是$COMPARE
?我更新了我的问题,以便您更清楚地了解$COMPARE发生了什么。IFS会导致结果中的路径混乱,如下所示:/ORG的home/i“”-和比较中修改的代码在我的shell中不太起作用。而且,不能识别sort-h。不过,至少我的思路是正确的。你的bash版本说它(至少编译)在redhat上。这实际上是您的系统吗?@stroketh如果您的比较内容没有空格,您可以删除IFS,但是您是否确保包含前导的$
,即$'\n'
,而不是'\n'
?我完全按照您所说的复制了您的代码,所以它就在那里。一旦我尝试使用它,我就开始在脚本中出现语法错误,所以有些东西出了问题。排序版本为:Sort(GNU coreutils)5.97
IFS=$'\n' COMPARE=($(comm -23 "$HOMEOUT" "$USEROUT" |
comm -23 - <(printf "%s\n" "${FILTER[@]}" | sort))
find /*home*/"${COMPARE[@]}" -maxdepth 1 -type l