我编写了一个简短的bash脚本来查找目录及其子目录中的所有文件,根据大小对它们进行排序,只输出前10行。剧本的主要内容如下:

find . -type f -printf "%s %p\n" | sort -nr | head -n $lines | cut -d' ' -f2 | xargs du -aSh
total=`du -h | tail -n 1 | cut -f1`

第二行输出总大小。我刚才写的这篇文章,实际上我不记得我为什么在最后使用du输出每个文件。
这个脚本在我家里运行得很好,但是当我试图在我的工作空间中运行它时,我得到以下输出,脚本冻结,迫使我使用Cntl-C:
查找:../.OldFiles/.OldFiles:没有这样的设备
在我的工作空间中,有一个每24小时更新一次的.OldFiles目录。ls -a不会显示它。我认为这是到另一个空间的链接,但不知怎么的,find被.OldFiles/.OldFiles绊倒了。编辑:.OldFiles实际上是一个挂载的文件系统,而不是一个链接。
find . -type f -printf "%s %p\n"

这项工作只能在命令行中找到,但管道似乎是出现错误的地方:
find . -type f -printf "%s %p\n" | sort -nr

会失败的。
我尝试在.OldFiles路径上使用排除,但得到了相同的输出:
>find . -type f ! -path "*.OldFiles/*"
find: ./.OldFiles/.OldFiles: No such device

有人能帮我吗?我找不到办法解决这个问题。

最佳答案

你不只是想否定一条路径,因为find会一直检查它的子目录,你需要-prune它。
所以试试这个

find . -path './.OldFiles' -prune -o -type f -print

在逻辑上被视为
find . (-path './.OldFiles' AND -prune) OR (-type f AND -print)

07-24 13:33