gpt4 book ai didi

linux - 在 bash 中搜索多个目录

转载 作者:太空宇宙 更新时间:2023-11-04 11:22:53 26 4
gpt4 key购买 nike

我正在尝试弄清楚如何搜索多个目录,这些目录是用 pushd 定义的,以便找到列表中文件夹的磁盘空间,以及是否有任何文件夹是符号链接(symbolic link)。现在我有一些非常低效的 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/家2/用户3/home3/user4

有人可以建议一种更好/更有效的方法吗?总的来说,我想弄清楚如何浓缩它。

Bash 版本:

GNU bash, version 3.2.25(1)-release-(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[@]}"...


COMPARE 包裹在 () 中,构造成一个数组。

IFS=$'\n' COMPARE=($(comm -23 "$HOMEOUT" "$USEROUT" |
comm -23 - <(printf "%s\n" "${FILTER[@]}" | sort))

并使用它:

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

关于linux - 在 bash 中搜索多个目录,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16859356/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com