递归查找最大文件


41

我试图递归地在目录中找到最大的文件。如果该目录内有一个子目录,则该函数需要进入该目录内,并检查是否存在最大的文件。找到最大文件后,将显示输出,并显示相对路径名以及最大文件的名称和大小。

例如:

dude@shell2 (~...assignment/solutions) % bash maxfile.sh ~/test
class/asn
dude.h.gch: 9481628

这就是我所拥有的:

#!/bin/sh
clear

recursiveS() {
    for d in *; do
        if [ -d $d ]; then
            (cd $d; echo $(pwd)/$line; du -a; recursiveS;)
        fi
    done
}
recursiveS

我已经被卡住了一段时间了。我无法通过流水线化许多现有的Unix工具来实现这一点。任何想法都很好!



走在只有子目录: for d in */ .[^.]*/; 做...`
Olivier Dulac

Answers:


54

使用find(此处假定为GNU find)输出具有文件大小的文件名。分类。打印出最大的一个。

find . -type f -printf "%s\t%p\n" | sort -n | tail -1

假定文件路径不包含换行符。


bash在GNU实现中使用循环stat

shopt -s globstar
max_s=0
for f in **; do
  if [[ -f "$f" && ! -L "$f" ]]; then
    size=$( stat -c %s -- "$f" )
    if (( size > max_s )); then
      max_s=$size
      max_f=$f
    fi
  fi
done
echo "$max_s $max_f"

这将比查找解决方案慢得多。这也假定文件名不以换行符结尾,并且将跳过隐藏的文件并且不属于隐藏目录。

如果-当前目录中有一个文件,则将考虑在stdin上打开的文件的大小。

bash当降级目录树时,请注意4.3之前的版本遵循符号链接。


谢谢,它有效!感谢您的帮助。我正在尝试习惯于在Shell中进行编程。我现在还不了解很多,所以感谢您告诉我那行代码是怎么回事。
user2419571

快速提问:出于好奇,是否有一种方法不需要管道命令?我很好奇,因为我看到的每个示例都使用了某种形式的管道。
user2419571 2014年

2
我相信还有其他方法可以做到。UNIX的哲学是工具应该是单一用途的,并且将它们链接在一起,以便一个命令的输出被输入到下一个命令的输入中。
glenn jackman 2014年

那讲得通。再次感谢你的帮助。
user2419571

2
@ user2419571:tail -n 1 <(sort -n <(find . -type f -printf "%s\t%p\n"));)
Cyrus


5

这适用于BSD / macOS:

find . -type f -ls | sort -k7 -r

您还可以追加| head -n 3显示有趣条目的数量(在这种情况下为3)。


1
可以通过解释其工作方式来改善此答案。而且,它看起来与已接受的答案非常相似(后者也无法完全解释其工作原理)。
dhag

man findman sort,使用brainz :-)
CeDeROM

在MacOS上无法真正使用,因为它无法正确返回大小并返回大量列。
索林

3

使用zsh,用于最大的常规文件:

ls -ld -- **/*(.DOL[1])

(当然,您可以ls -ld --用任何命令替换。如果使用GNU ls或兼容命令,另请参见人类可读尺寸-h选项)

  • .:仅常规文件(目录,符号链接,设备,FIFO等)
  • D:包括隐藏的内容并下降到隐藏的目录中
  • OL:按大小(Length)反向排列。
  • [1]:只有第一场比赛。

如果有关系,您将随机获得其中任何一个。如果要按字母顺序排列第一个,请添加一个附加字符onorder by name)以按字母顺序对领带进行排序。

请注意,它考虑的是文件大小,而不是磁盘使用情况。


...我开始相信您正在使用zsh的薪水;)(这很可能是?)。不幸的是,zsh并非在所有系统上都可用...
Olivier Dulac

可能获得前十个文件?(没有做像循环这样的愚蠢的事情)
Wowfunhappy

1
@Wowfunhappy替换[1][1,10]
斯特凡Chazelas
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.