use*_*571 44 bash shell-script recursive
我试图递归地在目录中找到最大的文件。如果该目录中有一个子目录,则该函数需要进入该目录并检查是否存在最大的文件。找到最大文件后,输出将显示相对路径名以及最大文件的名称和大小。
前任:
dude@shell2 (~...assignment/solutions) % bash maxfile.sh ~/test
class/asn
dude.h.gch: 9481628
Run Code Online (Sandbox Code Playgroud)
这就是我所拥有的:
#!/bin/sh
clear
recursiveS() {
for d in *; do
if [ -d $d ]; then
(cd $d; echo $(pwd)/$line; du -a; recursiveS;)
fi
done
}
recursiveS
Run Code Online (Sandbox Code Playgroud)
我已经被困了一段时间了。我无法通过流水线化一些现有的 Unix 工具来实现这一点。任何想法都会很好!
gle*_*man 62
使用find
(此处假设为 GNU find
)以输出文件大小的文件名。种类。打印出最大的一个。
find . -type f -printf "%s\t%p\n" | sort -n | tail -1
Run Code Online (Sandbox Code Playgroud)
假设文件路径不包含换行符。
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"
Run Code Online (Sandbox Code Playgroud)
这将比 find 解决方案慢得多。这也假设文件名不以换行符结尾,并且将跳过隐藏文件而不进入隐藏目录。
如果-
当前目录中有一个文件被调用,则将考虑在 stdin 上打开的文件的大小。
请注意bash
4.3 之前的版本在目录树下降时遵循符号链接。
小智 11
此命令也有助于列出定义的大小。
find . -type f -size +100M -exec ls -lh {} \;
Run Code Online (Sandbox Code Playgroud)
这适用于 BSD/macOS 并使用快速但非 POSIX 的实用程序-ls
扩展find
:
find . -type f -ls | sort -k7 -r | head -n 3
Run Code Online (Sandbox Code Playgroud)
这速度较慢,但可能适用于以下-ls
扩展不可用的POSIX 系统find
:
find . -type f -exec ls -al {} \; | sort -k5 -r | head -n3
Run Code Online (Sandbox Code Playgroud)
这个怎么运作:
find
是一个强大的文件搜索实用程序,它将根据下面解释的给定查询向您显示结果。find .
将在当前工作目录中搜索。find . -type f
将仅搜索指定的文件类型“f”,即常规文件(这意味着它将跳过目录、特殊文件、链接、套接字等)。-ls
开关将指示find
显示有关找到的文件的完整信息。但是,根据 BSD 系统上的 man 的说法,它是 IEEE Std 1003.1-2001(“POSIX.1”)标准的扩展,可能并非在所有平台上都可用。-ls
您的系统上没有扩展名,您可以-exec .. {} \;
使用ls -al
命令并使用第 5 个字段对结果进行排序。{}
表示已找到的文件名。\;
包含-exec
命令。|
Unix 符号的意思是“管道”,它将一个程序的输出重定向到另一个程序的输入。它将find
程序输出文本作为输入发送到sort
程序。sort
是一个排序实用程序。它获取数据行,然后将这些行按升序排序作为结果。sort -k7
表示取第 7 个字段作为排序参数值。参数由空格分隔。第 7 个参数是find
实用程序生成的文件大小。如果您使用-exec ls -al {} \;
而不是,-ls
那么您将使用第 5 个字段-k5
进行排序。-r
告诉sort
使用最大的反向排序。因为我们想先查看最大的文件。|
) 将排序的输出发送到head
实用程序,该实用程序将只显示-n 3
结果输出的前三行(按照 指示)。长话短说:find
用于查找递归常规文件,仅在当前工作目录中开始搜索,然后使用-ls
扩展名(或执行ls -al
)显示有关该文件的完整信息。稍后将结果从find
tosort
使用 unix pipe传递,|
并根据第 7 个(或第 5 个)字段将其排序为最大。此外,您可以n
使用head
实用程序将结果限制为行。
我的意思是“使用brainz”让您阅读“男人”并自己离线搜索解决方案,这将训练您从头开始解决问题:-)
归档时间: |
|
查看次数: |
55248 次 |
最近记录: |