我需要编写一个脚本来查找给定目录中的最大文件(包括其子目录)。
我发现如果我使用" tree"为了生成所有文件的文本表示,也许我可以让脚本比较大小并输出最大的文件。
我最终得到了一个看起来像这样的文本文件
.
[ 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条目,但没有运气。
Read a file line by line assigning the value to a variable
Looping through the content of a file in Bash?
请注意,树能够使用<directory name="fileName" size="XXXX"></directory>
之类的标签和属性将输出格式化为xml文件
因此,如果解析xml文件更容易,那也没关系。
文件夹也列在那里,但我们可以忽略它。
任何帮助将不胜感激, 感谢
答案 0 :(得分:1)
只需按数字对列表进行排序,然后抓住第一行:
sort -V yourList.txt | head -n
我觉得你有一个相当大的脚本来生成列表。该列表也有点不安全。如果文件名包含换行符会发生什么(是的,这可能在linux上)?以下命令查找最大的文件和当前目录(包括子目录)并打印其大小和名称。
find . -type f -exec du -b {} + | sort -nr | head -n 1
如果您只想要文件,请在末尾添加| sed 's/^[0-9]\+\t//'
。
答案 1 :(得分:1)
请勿使用tree
。相反,只需遍历文件并调用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
代替{{1} }}。)
一个反对意见是它需要多次调用-c
。这很昂贵,但避免了(公认的罕见)问题
处理文件名序列(当文件名可以包含换行符时很复杂)。
如果您有stat
可用,则只需zsh
即可。如果你实际上是使用 max_file=$(zsh -c 'print **/*(OL[1])')
,那么它只是zsh
。
如果您决定不担心带换行符的文件名,可以执行以下操作:
print -v max_file **/*(OL[1])
我将处理包含换行符的文件名作为练习留给读者;通常,我会使用一种可以正确表示任意字符串序列的不同语言。另一种选择是查看find . -exec stat -c '%s %n' {} + | sort -k2,2nr | head -1
源代码分发的finfo
目录中的examples/loadables
命令。这是一个创建shell内置命令的示例,它在不创建新进程的情况下执行与bash
相同的操作。可以修改它以添加类似于stat
支持的-v
选项,以便您可以从输出中设置shell变量。
printf