English 中文(简体)
如何获取查找命令以文件名打印文件大小?
原标题:How do I get the find command to print out the file size with the file name?
最佳回答
find . -name  *.ear  -print0 | xargs -0 ls -lhS

Jer.drab.orgs的答复中只增加了 h。 节省了心理上转换到 MB 的时间 ;)

问题回答

您需要使用 - exec 或 - printf. printf 这样的工作方式 :

find . -name *.ear -printf "%p %k KB
"

- 执行能力更强,可以执行任意命令 - 以便您可以使用 IS 或 wc 的版本打印文件名和其他信息。 男人会发现您可以打印的参数, 这比文件化要多得多 。

[edit] - printf 不在官方 POSIX 标准中, 请检查您的版本是否支持它。 但是, 大多数现代系统会使用 GNU 查找或类似的扩展版本, 因此它很有可能被执行 。

简单的解决办法是使用 -ls 选项在 find 中使用:

find . -name *.ear -ls

给您每个条目以“ ls - l” 格式的正常格式。 或者, 为了获取您似乎正在寻找的具体输出, 如下:

find . -name *.ear -printf "%p	%k KB
"

这将为您提供文件名, 然后是 KB 的大小 。

Using GNU find, I think this is what you want. It finds all real files and not directories (-type f), and for each one prints the filename (%p), a tab ( ), the size in kilobytes (%k), the suffix " KB", and then a newline ( ).

find . -type f -printf  %p	%k KB
 

如果 printf 命令不按您想要的方式格式化事物, 您可以使用 exec , 并跟随您要对每个文件执行的命令。 为文件名使用 {%, 并用分号终止命令 (; ) 。 在大多数贝壳上, 所有三个字符都应该用反斜线逃跑 。

在此使用“ ls - lh” 找到并打印它们的简单解决方案, 它会显示人类可读形式的大小( 千字节为 < em>k , 兆字节为 < em> M ):

find . -type f -exec ls -lh {} ;

作为另一个选项, “wc - c” 将打印文件中的字符数( 字节) :

find . -type f -exec wc -c {} ;
find . -name  *.ear  -exec du -h {} ;

这只给了您文件, 而不是所有不必要的文件 。

使用磁盘使用命令(du -h)列出符合模式( -name *.ear )的文件( -type f ),并按人类可读文件大小(sort -h)对文件进行排序:

find . -type f -name  *.ear  -exec du -h {} ; | sort -h

产出产出产出产出产出产出产出产出产出产出产出产出产出产出产出产出产出产出产出产出产出产出产出产出产出产出产出产出产出产出产出产出产出产出产出产出产出产出产出产出产出产出产出产出产出产出产出产出产出产出产出产出产出产出产出产出产出产出产出产出产出产出产出产出产出产出产出产出产出产出产出产出产出产出产出产出产出产出产出产出产出产出产出产出产出产出产出产出产出产出产出产出产出产出产出产出产出产出产出产出产出产出产出产出产出产出产出产出产出产出产出产出产出产出产出产出产出产出产出产出产出产出产出产出产出产出产出产出产出产出产出产出产出产出产出产出产出产出产出产出产出产出产出产出产出产出产出产出产出产出产出产出产出产出产出产出产出产出产出产出产出产出产出产出产出产出产出产出产出产出产出产出产出产出产出产出产出产出产出产出产出产出产出产出产出产出产出产出产出产出产出产出产出产出产出产出产出产出产出产出产出产出产出产出产出产出产出产出产出产出产出产出产出产出产出产出产出产出产出产出产出产出产出产出产出产出产出产出产出产出产出产出产出产出产出产出产出产出产出产出产出产出产出产出产出产出产出产出产出产出产出产出产出产出产出产出产出产出产出产出产出产出产出产出产出产出产出产出产出产出产出产出产出产出产出产出产出产出产出产出产出产出产出产出产出产出产出产出产出产出产出产出产出产出产出产出产出

5.0k  ./dir1/dir2/earFile1.ear
5.4k  ./dir1/dir2/earFile2.ear
5.4k  ./dir1/dir3/earFile1.ear

Awk 可以修复输出, 以给出询问者所要求的。 在我 Solaris 10 系统中, 找到KB 中的 - ls 指纹大小作为第二个字段, 所以 :

% find . -name  *.ear  -ls | awk  {print $2, $11} 
5400 ./dir1/dir2/earFile2.ear
5400 ./dir1/dir2/earFile3.ear
5400 ./dir1/dir2/earFile1.ear

Otherwise, use -exec ls -lh and pick out the size field from the output. Again on Solaris 10:

% find . -name  *.ear  -exec ls -lh {} ; | awk  {print $5, $9} 
5.3M ./dir1/dir2/earFile2.ear
5.3M ./dir1/dir2/earFile3.ear
5.3M ./dir1/dir2/earFile1.ear

尝试以下命令 :

GNU stat :

find . -type f -name *.ear -exec stat -c "%n %s" {}  ; 

BSD stat :

find . -type f -name *.ear -exec stat -f "%N %z" {}  ; 

stat 不是标准,所以 du >wc 可以是一个更好的办法:

find . -type f -name *.ear -exec sh -c  echo "{} $(wc -c < {})"   ; 

我在Mac OS X 上与它挣扎,发现命令不支持 -printf

我发现一个解决方案, 诚然,这个解决方案 依靠小组 所有的档案 工作人员是...

ls -l -R | sed  s/(.*)staff *([0-9]*)..............(.*)/2 3/ 

这样将Is 长输出分割为三个符号

  1. the stuff before the text staff
  2. the file size
  3. the file name

然后输出符号 2 和 3, 即输出为字节数, 然后文件名

8071 sections.php
54681 services.php
37961 style.css
13260 thumb.php
70951 workshops.php

为什么不使用“强”杜-a

find . -name "*.ear" -exec du -a {} ;

使用一个Mac

这将为您提供您想要的, 包括格式化( 即文件名先于文件名, 其后大小 ) :

find . -type f -iname "*.ear" -exec du -ah {} ; | awk  {print $2"	", $1} 

样本输出( 我使用 - iname " *.php" 来取得某种结果 ) :

./plugins/bat/class.bat.inc.php  20K
./plugins/quotas/class.quotas.inc.php    8.0K
./plugins/dmraid/class.dmraid.inc.php    8.0K
./plugins/updatenotifier/class.updatenotifier.inc.php    4.0K
./index.php      4.0K
./config.php     12K
./includes/mb/class.hwsensors.inc.php    8.0K

你可以试试这个:

find. -name *.ear -exec du {} ;

这将为您提供以字节表示的大小。 但是 du 命令也接受 KB 的参数 - k, MB 的参数 - k 和 MB 的参数。 这将给您一个类似输出的输出

5000  ./dir1/dir2/earFile1.ear
5400  ./dir1/dir2/earFile2.ear
5400  ./dir1/dir3/earFile1.ear
find . -name "*.ear" | xargs ls -sh
find . -name "*.ear" -exec ls -l {} ;

如果您需要获得总大小, 以下是一个脚本建议

#!/bin/bash
totalSize=0

allSizes=`find . -type f -name *.ear -exec stat -c "%s" {} ;`

for fileSize in $allSizes; do
    totalSize=`echo "$(($totalSize+$fileSize))"`
done
echo "Total size is $totalSize bytes"

您可以尝试循环 :

for i in `find . -iname "*.ear"`; do ls -lh $i; done




相关问题
Portable way to get file size (in bytes) in the shell

On Linux, I use stat --format="%s" FILE, but the Solaris machine I have access to doesn t have the stat command. What should I use then? I m writing Bash scripts and can t really install any ...

Unix: fast remove directory for cleaning up daily builds

Is there a faster way to remove a directory then simply submitting rm -r -f *directory* ? I am asking this because our daily cross-platform builds are really huge (e.g. 4GB per build). So the ...

Startup time in Solaris server using shell script

How to find the start up time of a Solaris 5.1 server using a shell script,need to know how much time it took to be on running state?I need to know how much time it took to come to running mode from ...

Ruby 1.8.6 BigDecimal.to_f always returns 0,0 on Solaris

I have come across a very weird error. I m on Solaris 10, using Ruby Enterprise Edition (ruby 1.8.6 (2008-08-08 patchlevel 286) [i386-solaris2.10]) with Rails 2.3.4. I have a very weird error. In irb: ...

Where to set JDK to be used for SunOne server?

Where to set the JDK to be used by the SunOne server on Solaris? Is it all configured via an environment variable like JDK_HOME or JAVA_HOME, or is there a config file for the SunOne server somewhere ...

热门标签