【发布时间】:2023-04-07 01:48:01
【问题描述】:
我试图弄清楚如何搜索多个使用 pushd 定义的目录,以查找列表中文件夹的磁盘空间,以及是否有任何文件夹是符号链接。现在我有一些效率很低的 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 '{}'
如您所见,这不起作用,因为我希望它像这样搜索列表中的每个用户(取决于他们的文件夹所在的位置):
/home/用户 /home/user2 /home2/user3 /home3/user4
有人可以提出一种更好/更有效的方法来实际工作吗?总的来说,我想弄清楚如何才能浓缩这一点。
Bash 版本:
GNU bash,版本 3.2.25(1)-release-(x86_64-redhat-linux-gnu)
提前致谢!
【问题讨论】:
-
为什么要将目录推送到目录堆栈?此外,无需创建
DIRS变量;只需使用for i in /home/*; do -
这似乎是在 bash 脚本中拥有多个工作目录的最佳方式,因为我想搜索服务器上找到的任何 /home* 目录。如果不是这样,我愿意采用更好的方法来做到这一点。
-
目录栈只是让切换到以前使用的工作目录更容易;一次只有一个工作目录。你从不使用堆栈,因为你从不调用
cd或popd。但是,您也永远不会使用工作目录,因为您总是将要搜索的目录作为显式参数传递给du和find。 -
您不必在目录中才能阅读它。
-
下一个问题:
$COMPARE是什么?
标签: linux bash unix scripting centos