file - 查找大文件 - 查询该目录及子目录下所有的以conf为后缀的文件




Bash-如何在目录及其子目录中找到最大的文件? (10)

我们刚刚开始了一个UNIX类,正在学习各种Bash命令。 我们的任务涉及在一个目录下执行各种命令,该目录下面还有许多文件夹。

我知道如何使用以下命令列出并计算根文件夹中的所有常规文件:

find . -type l | wc -l

但我想知道从哪里去找到整个目录中最大的文件。 我已经看到了一些关于du命令的问题,但我们还没有意识到这一点,所以在我们学习的东西中我假设我们需要以某种方式将它连接到ls -t命令。

如果我的'行话'不正确,请原谅我,我仍然习惯它!


du -aS /PATH/TO/folder | sort -rn | head -2 | tail -1

要么

du -aS /PATH/TO/folder | sort -rn | awk 'NR==2'


Linux解决方案:例如,您希望根据文件/文件夹大小( 降序 )查看您家(/)目录的所有文件/文件夹列表。

sudo du -xm / | sort -rn | 更多


列出文件夹中较大的文件

ls -sh /pathFolder | sort -rh | head -n 1

ls -sh的输出是文件大小号的大小和人类可理解的视图。

你可以使用ls -shS /pathFolder | head -n 1 ls -shS /pathFolder | head -n 1 。 来自ls的更大的S已经将列表从较大的文件排序到较小的文件,但第一个结果是该文件夹中所有文件的总和。 所以,如果你只想列出更大的文件,一个文件,你需要head -n 2并检查“第二行结果”或使用ls sort head的第一个例子。


在Solaris上我使用:

find . -type f -ls|sort -nr -k7|awk 'NR==1{print $7,$11}' #formatted

要么

find . -type f -ls | sort -nrk7 | head -1 #unformatted

因为这里发布的任何内容都不起作用。 这将在$PWD和子目录中找到最大的文件。


尝试下面的命令:

find /your/path -printf "%k %p\n" | sort -g -k 1,1 | awk '{if($1 > 500000) print $1/1024 "MB" " " $2 }' |tail -n 1 

这将打印最大的文件名和大小,并且超过500M。 您可以移动if($1 > 500000) ,它将打印目录中最大的文件。


没有简单的命令可以找到Linux / UNIX / BSD文件系统上最大的文件/目录。 但是,结合以下三个命令(使用管道)可以轻松找出最大文件的列表:

# du -a /var | sort -n -r | head -n 10

如果你想要更多的人类可读的输出尝试:

$ cd /path/to/some/var
$ du -hsx * | sort -rh | head -10

哪里,

  • Var是您要搜索的目录
  • du命令-h选项:以可读格式显示尺寸(例如,1K,234M,2G)。
  • du命令-s选项:仅显示每个参数的总数(摘要)。
  • du命令-x选项:跳过不同文件系统上的目录。
  • 排序命令-r选项:反转比较结果。
  • 排序命令-h选项:比较人类可读的数字。 这只是GNU排序特定的选项。
  • 头部命令-10 OR -n 10选项:显示前10行。

试试以下一行(显示前20个最大的文件):

ls -1Rs | sed -e "s/^ *//" | grep "^[0-9]" | sort -nr | head -n20

或(人类可读尺寸):

ls -1Rhs | sed -e "s/^ *//" | grep "^[0-9]" | sort -hr | head -n20

与其他答案相比,在Linux / BSD / OSX下工作良好,因为find -printf选项在OSX / BSD上不存在, stat根据操作系统具有不同的参数。 然而,第二个命令适当地处理OSX / BSD(因为sort没有-h ),请安装从coreutils sort或从ls删除-h ,然后使用sort -nr

所以这些别名在你的rc文件中很有用:

alias big='du -ah . | sort -rh | head -20'
alias big-files='ls -1Rhs | sed -e "s/^ *//" | grep "^[0-9]" | sort -hr | head -n20'

该脚本简化了查找最大文件的进一步操作。 我把它放在我的〜/ bin目录下,并把〜/ bin放在我的$ PATH中。

#!/usr/bin/env bash
# scriptname: above
# author: Jonathan D. Lettvin, 201401220235

# This finds files of size >= $1 (format ${count}[K|M|G|T], default 10G)
# using a reliable version-independent bash hash to relax find's -size syntax.
# Specifying size using 'T' for Terabytes is supported.
# Output size has units (K|M|G|T) in the left hand output column.

# Example:
#   ubuntu12.04$ above 1T
#   128T /proc/core

# http://.com/questions/1494178/how-to-define-hash-tables-in-bash
# Inspiration for hasch: thanks Adam Katz, Oct 18 2012 00:39
function hasch() { local hasch=`echo "$1" | cksum`; echo "${hasch//[!0-9]}"; }
function usage() { echo "Usage: $0 [{count}{k|K|m|M|g|G|t|T}"; exit 1; }
function arg1() {
    # Translate single arg (if present) into format usable by find.
    count=10; units=G;  # Default find -size argument to 10G.
    size=${count}${units}
    if [ -n "$1" ]; then
        for P in TT tT GG gG MM mM Kk kk; do xlat[`hasch ${P:0:1}`]="${P:1:1}"; done
        units=${xlat[`hasch ${1:(-1)}`]}; count=${1:0:(-1)}
        test -n "$units" || usage
        test -x $(echo "$count" | sed s/[0-9]//g) || usage
        if [ "$units" == "T" ]; then units="G"; let count=$count*1024; fi
        size=${count}${units}
    fi
}
function main() {
    sudo \
        find / -type f -size +$size -exec ls -lh {} \; 2>/dev/null | \
        awk '{ N=$5; fn=$9; for(i=10;i<=NF;i++){fn=fn" "$i};print N " " fn }'
}

arg1 $1
main $size

这样做非常简单:

ls -l | tr -s " " " " | cut -d " " -f 5,9 | sort -n -r | head -n 1***

你会得到这个: 8445 examples.desktop


find . -type f | xargs ls -lS | head -n 1

输出

-rw-r--r--  1 nneonneo  staff  9274991 Apr 11 02:29 ./devel/misc/test.out

如果你只是想要文件名:

find . -type f | xargs ls -1S | head -n 1

这避免了使用awk并允许你在ls使用你想要的任何标志。

警惕 。 因为xargs试图避免构建超长的命令行,所以如果您在具有大量文件的目录上运行它,可能会失败,因为ls最终会执行多次。 这不是一个无法克服的问题(你可以从每个ls调用中收集head -n 1输出,然后再次运行ls -S ,直到你有一个文件),但是它确实有点损害了这种方法。







large-files