Linux Bash脚本通过解析文本树查找最大文件

Linux Bash脚本通过解析文本树查找最大文件,linux,bash,parsing,text,Linux,Bash,Parsing,Text,我需要编写一个脚本,查找给定目录(包括其子目录)中最大的文件 我发现,如果我使用“树”来生成所有文件的文本表示,那么也许我可以使用脚本来比较大小并输出最大的文件 我最终得到了一个类似这样的文本文件 . [ 939] "./Documents/Alfa/driver/wlan0up" [ 234] "./Documents/Alfa/driver/wpa1.conf" [ 1623520] "./Documents/Alfa/driver/wpa_suppl

我需要编写一个脚本,查找给定目录(包括其子目录)中最大的文件

我发现,如果我使用“树”来生成所有文件的文本表示,那么也许我可以使用脚本来比较大小并输出最大的文件

我最终得到了一个类似这样的文本文件

.
[        939]  "./Documents/Alfa/driver/wlan0up"
[        234]  "./Documents/Alfa/driver/wpa1.conf"
[    1623520]  "./Documents/Alfa/driver/wpa_supplicant-0.5.5.zip"
[    5488640]  "./Documents/Alfa/R36-V1.2.1.2b6.img"
[       3385]  "./Documents/C code/Ide.s"
[       4096]  "./Documents/fluxion-master"
[         25]  "./Documents/fluxion-master/_config.yml"
[       4096]  "./Documents/fluxion-master/docs"
[      35141]  "./Documents/fluxion-master/docs/LICENSE"
[      83788]  "./Documents/fluxion-master/fluxion"
~~ long list of other files
[       6909]  "./.ZAP/session/untitled2.script"
[      64411]  "./.ZAP/zap.log"
[       4096]  "./.zenmap"
[          0]  "./.zenmap/recent_scans.txt"
[       2018]  "./.zenmap/scan_profile.usp"
[         85]  "./.zenmap/target_list.txt"
[       1486]  "./.zenmap/zenmap.conf"
[     409600]  "./.zenmap/zenmap.db"
[          5]  "./.zenmap/zenmap_version"

429 directories, 3327 files
现在,我所需要的就是让脚本通读列表并比较大小,直到列表结束,然后输出最大文件的名称和大小

我使用sed和grep浏览了其他一些stackoverflow条目,但没有得到任何运气

请注意,tree能够将输出格式化为xml文件,使用标签和属性,如
因此,如果解析xml文件更容易,那也没问题

文件夹也列在那里,但我们可以忽略它

任何帮助都将不胜感激,
谢谢

请按数字对列表进行排序,然后抓取第一行:

sort -V yourList.txt | head -n 
我觉得你有一个相当大的脚本来制作这个列表。这份清单也有点不安全。如果文件名包含换行符会发生什么情况(是的,这在linux上是可能的)?以下命令在当前目录(包括子目录)中查找最大的文件和,并打印其大小和名称

find . -type f -exec du -b {} + | sort -nr | head -n 1

如果只需要文件,请在末尾添加
|sed的/^[0-9]\+\t/'

只需按数字对列表排序,然后抓取第一行:

sort -V yourList.txt | head -n 
我觉得你有一个相当大的脚本来制作这个列表。这份清单也有点不安全。如果文件名包含换行符会发生什么情况(是的,这在linux上是可能的)?以下命令在当前目录(包括子目录)中查找最大的文件和,并打印其大小和名称

find . -type f -exec du -b {} + | sort -nr | head -n 1

如果只需要该文件,请在末尾添加
|sed的/^[0-9]\+\t/'

不要使用
树。相反,只需迭代文件并调用
stat
即可获得每个文件的大小,记住迄今为止看到的最大文件。在
bash
4或更高版本中,它与

shopt -s globstar
for f in **/*; do
    size=$(stat -c %s)
    if (( size > max_size )); then
        max_size=$size
        max_file=$f
    fi
done
如果您有可用的
zsh
,那么它非常简单,只需
fname=$(zsh-c'print**/*(OL[1])

对于早期版本的
bash
,您需要定义一个递归函数来模拟
**

dir_iter () {
    for f in "$1"/*; do
        if [[ -d $f ]]; then
            dir_iter "$f"
        else
            size=$(stat -c %s)
            if ((size > max_size)); then
                max_size=$size
                max_file=$f
            fi
        fi
    done
}
dir_iter .
(请注意,有关
stat
命令的确切形式,您应该查阅本地文档,可能会有所不同。例如,BSD
stat
使用
-f
而不是
-c


一个反对意见是,它需要多次调用
stat
。这是昂贵的,但避免了(公认罕见的)问题 处理文件名序列的方法(当文件名可能包含换行符时,这很复杂)

如果您有可用的
zsh
,那么它非常简单,只要
max_file=$(zsh-c'print**/*(OL[1]))
。如果您实际使用的是
zsh
,那么它只是
print-vmax\u文件**/*(OL[1])

如果您决定不担心带有换行符的文件名,可以执行以下操作:

find . -exec stat -c '%s %n' {} + | sort -k2,2nr | head -1

我把处理包含换行符的文件名作为练习留给读者;通常,我会使用另一种语言来正确地表示任意字符串的序列。另一个选项是查看
bash
源发行版的
examples/loadables
目录中的
finfo
命令。这是一个创建shell内置命令的示例,该命令执行与
stat
相同的操作,而无需创建新进程。可以对其进行修改,添加一个类似于
printf
支持的
-v
选项,以便您可以从输出中设置shell变量

finfo -v size -s "$f"  # equivalent to size=$(stat -c %s "$f"), but all in shell

不要使用
。相反,只需迭代文件并调用
stat
即可获得每个文件的大小,记住迄今为止看到的最大文件。在
bash
4或更高版本中,它与

shopt -s globstar
for f in **/*; do
    size=$(stat -c %s)
    if (( size > max_size )); then
        max_size=$size
        max_file=$f
    fi
done
如果您有可用的
zsh
,那么它非常简单,只需
fname=$(zsh-c'print**/*(OL[1])

对于早期版本的
bash
,您需要定义一个递归函数来模拟
**

dir_iter () {
    for f in "$1"/*; do
        if [[ -d $f ]]; then
            dir_iter "$f"
        else
            size=$(stat -c %s)
            if ((size > max_size)); then
                max_size=$size
                max_file=$f
            fi
        fi
    done
}
dir_iter .
(请注意,有关
stat
命令的确切形式,您应该查阅本地文档,可能会有所不同。例如,BSD
stat
使用
-f
而不是
-c


一个反对意见是,它需要多次调用
stat
。这是昂贵的,但避免了(公认罕见的)问题 处理文件名序列的方法(当文件名可能包含换行符时,这很复杂)

如果您有可用的
zsh
,那么它非常简单,只要
max_file=$(zsh-c'print**/*(OL[1]))
。如果您实际使用的是
zsh
,那么它只是
print-vmax\u文件**/*(OL[1])

如果您决定不担心带有换行符的文件名,可以执行以下操作:

find . -exec stat -c '%s %n' {} + | sort -k2,2nr | head -1

我把处理包含换行符的文件名作为练习留给读者;通常,我会使用另一种语言来正确地表示任意字符串的序列。另一个选项是查看
bash
源发行版的
examples/loadables
目录中的
finfo
命令。这是一个创建shell内置命令的示例,该命令执行与
stat
相同的操作,而无需创建新进程。可以对其进行修改,添加一个类似于
printf
支持的
-v
选项,以便您可以从输出中设置shell变量

finfo -v size -s "$f"  # equivalent to size=$(stat -c %s "$f"), but all in shell

详细说明您的问题:按文件大小或文件中的行数查找最大的文件?对不起,我指的是大小,括号之间的数字以字节为单位。。不管怎么说,解决办法很简单。。谢谢回答您的问题:按文件大小或大小查找最大的文件