Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/bash/18.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Linux 在bash中搜索多个目录_Linux_Bash_Unix_Scripting_Centos - Fatal编程技术网

Linux 在bash中搜索多个目录

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

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

更新:

+ 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